Dlinyj (dlinyj) wrote,
Dlinyj
dlinyj

Тупик Карла Маркса

Что-то я столько сил положил на вывод на экран хоть что-нибдь, плюс за выходные ни разу не отдохнул, т.к. просто утоп в домашних делах. В результате чувствую себя выжатым лимоном, который переехал бронепоезд. По сему дальнейшие ковыряния провожу вяленько, в свободное от работы время.

Обо всём попорядку.

1. Было проверенно и доказано, что для картинки выводимой на экран значащим является только старший ниббл. А конкретно старшие три бита цвета. Остальные могут принимать любое значение и на изображение не влияют.
Это означает, что можно передавать по UART только старшую часть байта, которую удобно кодировать символами от 0 до F (HEX).

Была набросана небольшая программа (текст под катом), которая преобразует любой файл в поток старших ниблов

/* showpic.c */
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <string.h>

int main (int argc, char* argv[])
{
    unsigned int i;
    char *image, *tmp, l;
    int f_image = open ( argv[1], O_RDWR);                                 //open file into arg

    image= mmap(0, 800*600, PROT_READ, MAP_SHARED, f_image, 0); //load image into memory
    tmp=malloc(480000);
    memcpy(tmp,image,800*600);
    
    for (i=0;i<480000;i++) //tmp[i]=tmp[i]|0x0F;
    {
        l=(tmp[i]>>4)+'0';
        //printf("i=%d char=%c\n",i,l);
        printf("%c",l);
    }
    close(f_image);
    return 0;
}



Программа работает отлично, но... попытка передать что-либо затыкается. Точнее нет. Если сделать так:

./senddata any-file > /dev/ttyUSB*

То в консоли на ридере будет бежать текст как и положено. Однко, если в консоли на книжке сделать

cat /dev/tty > testfile

или

cat > testfile

то, увы - testfile в любом раскладе будет равен нулю. Не знаю почему. И консоль затыкается при таком подходе от обилия символов. Но если в minicom попробовать передать текстовый файл, а там опять же сделать так cat, то файл как-то криво передаётся, но опять же не полностью.

В общем, как обойти эту засаду я пока не знаю, и даже не знаю куда копать, кроме как в сторону драйверов или второго UARTa

2. Второй вариант - это попытка сменить драйвер USB. Камрад 22021977 провёл большую работу по сборке онного драйвера. О том как это сделать можно и нужно прочитать тут: http://dlinyj.livejournal.com/609590.html?thread=7841846#t7841846

Первая попытка загрузить драйвер у меня привела к панике ядра:

root@(none):/tmp/tmp/drivers# ls
g_ether.o  g_file_storage.o  g_zero.o  s1r72v17_udc.o
root@(none):/tmp/tmp/drivers# insmod g_ether.o 
g_ether.o parameter qmult has unknown format character 'd'
Unable to handle kernel NULL pointer dereference at virtual address 000000b4
pgd = c3e74000
*pgd = 0be99801, *pmd = 0be99801, *pte = 00000000, *ppte = 00000000
Internal error: Oops: 0
CPU: 0
pc : []    lr : []    Tainted: P 
sp : c1bffdf0  ip : c1bffe28  fp : c1bffe24
r10: 000000b0  r9 : 00000000  r8 : c3c59cec
r7 : 000000b8  r6 : c3c59c00  r5 : c3c59db0  r4 : c3c05080
r3 : c3c59e58  r2 : 00000000  r1 : a0000013  r0 : c3c59e58
Flags: nzcv  IRQs off  FIQs on  Mode SVC_32  Segment user
Control: C000317F  Table: 0BE74000  DAC: 00000015
Process insmod (pid: 173, stackpage=c1bff000)
Stack: (0xc1bffde0 to 0xc1c00000)
fde0: c5ad116c c0027070 00000093 ffffffff c3c59e58 a0000013 00000003 c3c05080 
fe00: c3c59db0 c3c59c00 000001a8 c3c59cec ffffff98 00000003 c1bffe34 c1bffe28 
fe20: c5ad116c c0027038 c1bffe4c c1bffe38 c5ad13f8 c5ad1158 c02dcca0 c3c59da8 
fe40: c1bffe64 c1bffe50 c5abc004 c5ad13b8 c3c59dcc 000000e0 c1bffe90 c1bffe68 
fe60: c5abc128 c5abbfb0 00000000 c3c59c00 00000000 c3c59c00 00000000 00000000 
fe80: 0003b7b0 c1bffea8 c1bffe94 c5abc24c c5abc0dc c3c59c00 c5b0e000 c1bffec8 
fea0: c1bffeac c5ab7cbc c5abc218 c5b10814 c5b0e000 c1591000 c3c59c00 fffffff4 
fec0: c1bffecc c5b0fbd0 c5ab7c34 c5b0e000 c1591000 ffffffea 00000060 c3c59c00 
fee0: c5b0e000 c1591000 ffffffea 00000060 00000007 0003b7b0 c1bfff10 c5ab87b8 
ff00: 00000000 c1bfffac c1bfff14 c002b504 c5ab8764 c1bfe000 c1591000 c1592000 
ff20: c3787de0 00000060 c5b0c000 c5b0e060 00002ac4 00000000 00000000 00000000 
ff40: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
ff60: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
ff80: 00000000 bfffcfc4 00032858 0003b7b0 00000080 c001c964 c1bfe000 00000000 
ffa0: 00000000 c1bfffb0 c001c7e0 c002ae30 bfffcfc4 c0022d9c 00028228 0003b7b0 
ffc0: ffffffff fbad2a84 bfffcfc4 00032858 0003b7b0 c5b0e000 00002ac4 00000000 
ffe0: 00000000 bfffcf94 400e65f0 bfffcf84 00018788 400e65fc 60000010 00028228 
Backtrace: 
Function entered at [] from []
Function entered at [] from []
Function entered at [] from []
 r5 = C3C59DA8  r4 = C02DCCA0 
Function entered at [] from []
 r5 = 000000E0  r4 = C3C59DCC 
Function entered at [] from []
Function entered at [] from []
 r5 = C5B0E000  r4 = C3C59C00 
Function entered at [] from []
 r7 = C3C59C00  r6 = C1591000  r5 = C5B0E000  r4 = C5B10814
Backtrace aborted due to bad frame pointer 
Code: 0a00005d e247a008 (e59a4004) e51b202c e5943000 
Segmentation fault
root@(none):/tmp/tmp/drivers# Unable to handle kernel NULL pointer dereference at virtual address 00000026
pgd = c0004000
*pgd = 00000000, *pmd = 00000000
Internal error: Oops: 0
CPU: 0
pc : []    lr : []    Tainted: P 
sp : c018de88  ip : 00000000  fp : c018def4
r10: 00000000  r9 : c3c59cc8  r8 : 00000000
r7 : c3c59c00  r6 : c3c59c00  r5 : c018dec4  r4 : 00000012
r3 : 00000012  r2 : 00000000  r1 : c5b10826  r0 : 00000012
Flags: Nzcv  IRQs off  FIQs on  Mode SVC_32  Segment kernel
Control: C000317F  Table: 08340000  DAC: 0000001D
Process swapper (pid: 0, stackpage=c018d000)
Stack: (0xc018de78 to 0xc018e000)
de60:                                                       c5b0e5f8 c5b0e524 
de80: 80000093 ffffffff c3c59c00 c018deb4 c018de9c c5abb804 c5ab6070 c3c59c00 
dea0: 00400012 c3c59c00 c018dec4 00000006 00000080 c5ab992c 00000000 00000000 
dec0: 00000000 01000680 00400000 00000005 c5abd918 00000008 c3c59c00 00000000 
dee0: 00000000 00000000 c018df24 c018def8 c5ab8a98 c5ab903c a0000013 c01a96a0 
df00: c37873a0 0000000d 04000000 c01a0dbc c018df54 c01a0c1c c018df50 c018df28 
df20: c001d0ac c5ab8998 c018df88 0000ffff 00000001 c0023524 60000013 ffffffff 
df40: c01a1428 c018dfa8 c018df54 c001c4e0 c001d000 00000000 00000032 00000000 
df60: 00000000 c001d51c c018c000 c018c000 c018ee70 c001d51c 41129200 c01a1428 
df80: c018dfa8 c018dfac c018df9c c001d530 c0023524 60000013 ffffffff c018dfd0 
dfa0: c018dfac c001d5e4 c001d52c 00004000 c01cb2f0 c01a145c c01a1450 c018ec48 
dfc0: 080169c8 c018dfe0 c018dfd4 c001c030 c001d58c c018dffc c018dfe4 c000896c 
dfe0: c001c010 c01a1874 c01d4c6c c01d4c6c 00000000 c018e000 c0008080 c000880c 
Backtrace: 
Function entered at [] from []
Function entered at [] from []
Function entered at [] from []
Function entered at [] from []
Function entered at [] from []
Function entered at [] from []
Function entered at [] from []
Code: e5973004 e1a00004 (e1d311b4) eb00090c e3500000 
Kernel panic: Aiee, killing interrupt handler!
In interrupt handler - not syncing





Если попробовать сначала загрузить g_zero.o (даже не знаю, что за драйвер), то он на него ругнётся, но не запаникует. Потом можно даже загрузить с неким успехом g_ether.o

root@(none):/tmp/t1/tmp/drivers# insmod g_zero.o 
Unable to handle kernel NULL pointer dereference at virtual address 000000b4
pgd = c3b7c000
*pgd = 0bb94801, *pmd = 0bb94801, *pte = 00000000, *ppte = 00000000
Internal error: Oops: 0
CPU: 0
pc : []    lr : []    Tainted: P 
sp : c1b51e04  ip : c1b51e3c  fp : c1b51e38
r10: 000000b0  r9 : 00000000  r8 : c3e9b4ec
r7 : 000000b8  r6 : c3e9b400  r5 : c3e9b5b0  r4 : c3c0505c
r3 : c3e9b658  r2 : 00000000  r1 : a0000013  r0 : c3e9b658
Flags: nzcv  IRQs off  FIQs on  Mode SVC_32  Segment user
Control: C000317F  Table: 0BB7C000  DAC: 00000015
Process insmod (pid: 171, stackpage=c1b51000)
Stack: (0xc1b51df4 to 0xc1b52000)
1de0:                                              c5ad116c c0027070 00000093 
1e00: ffffffff c3e9b658 a0000013 00000003 c3c0505c c3e9b5b0 c3e9b400 000001a8 
1e20: c3e9b4ec ffffff98 00000003 c1b51e48 c1b51e3c c5ad116c c0027038 c1b51e60 
1e40: c1b51e4c c5ad13f8 c5ad1158 c02dcbe0 c3e9b5a8 c1b51e78 c1b51e64 c5abc004 
1e60: c5ad13b8 c3e9b5cc 000000e0 c1b51ea4 c1b51e7c c5abc128 c5abbfb0 00000000 
1e80: c3e9b400 00000000 000001f0 c5b102e4 00000006 0003a728 c1b51ebc c1b51ea8 
1ea0: c5abc24c c5abc0dc c3e9b400 c3e9b400 c1b51edc c1b51ec0 c5ab7cbc c5abc218 
1ec0: c1b481e0 c3e9b400 c1b481a0 000001f0 c1b51f10 c1b51ee0 c5b0f4b4 c5ab7c34 
1ee0: 0003a728 c1b51f00 c3e9b400 c5b0e000 c1c60000 ffffffea 00000060 c5ab87b8 
1f00: 00000000 c1b51fac c1b51f14 c002b504 c5ab8764 c1b50000 c1c60000 c1c61000 
1f20: c3787de0 00000060 c5b0c000 c5b0e060 00002510 00000000 00000000 00000000 
1f40: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
1f60: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
1f80: 00000000 bfffcfc4 00032858 0003a728 00000080 c001c964 c1b50000 00000000 
1fa0: 00000000 c1b51fb0 c001c7e0 c002ae30 bfffcfc4 c0022d9c 00028228 0003a728 
1fc0: ffffffff fbad2084 bfffcfc4 00032858 0003a728 c5b0e000 00002510 00000000 
1fe0: 00000000 bfffcf94 400e65f0 bfffcf84 00018788 400e65fc 60000010 00028228 
Backtrace: 
Function entered at [] from []
Function entered at [] from []
Function entered at [] from []
 r5 = C3E9B5A8  r4 = C02DCBE0 
Function entered at [] from []
 r5 = 000000E0  r4 = C3E9B5CC 
Function entered at [] from []
Function entered at [] from []
 r5 = C3E9B400  r4 = C3E9B400 
Function entered at [] from []
 r7 = 000001F0  r6 = C1B481A0  r5 = C3E9B400  r4 = C1B481E0
Function entered at [] from []
 r4 = 00000000 
Function entered at [] from []
Code: 0a00005d e247a008 (e59a4004) e51b202c e5943000 
Segmentation fault
root@(none):/tmp/t1/tmp/drivers# insmod g_ether.o 
g_ether.o parameter qmult has unknown format character 'd'
usb0: Ethernet Gadget, version: Equinox 2004
usb0: using s1r72v17, OUT ep2 IN ep1
usb0: MAC 16:f1:b7:9f:a5:60
root@(none):/tmp/t1/tmp/drivers# usb0: can't enable ep1, result 0



Правда тут не всё так радужно.
root@(none):/tmp/t1/tmp/drivers# ifconfig usb0 192.168.1.15 netmask 255.255.255.0                      
modprobe: modprobe: Can't locate module usb0
SIOCSIFADDR: No such device
modprobe: modprobe: Can't locate module usb0
usb0: unknown interface: No such device
modprobe: modprobe: Can't locate module usb0
SIOCSIFNETMASK: No such device
root@(none):/tmp/t1/tmp/drivers# 


Попробуем снова выгрузить-загрузить и поднять интерфейс:

root@(none):/tmp/t1/tmp/drivers# rmmod g_ether
root@(none):/tmp/t1/tmp/drivers# insmod g_ether.o                       
g_ether.o parameter qmult has unknown format character 'd'
usb0: Ethernet Gadget, version: Equinox 2004
usb0: using s1r72v17, OUT ep2 IN ep1
usb0: MAC 06:c6:45:50:63:7a
root@(none):/tmp/t1/tmp/drivers# usb0: can't enable ep1, result 0
   
root@(none):/tmp/t1/tmp/drivers# 
root@(none):/tmp/t1/tmp/drivers# ifconfig usb0 up
Unable to handle kernel paging request at virtual address 000010a7
pgd = c3b7c000
*pgd = 0bb94801, *pmd = 0bb94801, *pte = 00000000, *ppte = 00000000
Internal error: Oops: 0
CPU: 0
pc : []    lr : []    Tainted: P 
sp : c1b51e7c  ip : 00000001  fp : 00001043
r10: 00000000  r9 : bffffbfc  r8 : c3b4dc00
r7 : 00000000  r6 : 00001002  r5 : 00000000  r4 : c3b4dc00
r3 : c5b131dc  r2 : c00f8dd8  r1 : 00001043  r0 : c3b4dc00
Flags: NzCv  IRQs on  FIQs on  Mode SVC_32  Segment user
Control: C000317F  Table: 0BB7C000  DAC: 00000015
Process ifconfig (pid: 181, stackpage=c1b51000)
Stack: (0xc1b51e6c to 0xc1b52000)
1e60:                            c00f8d44 c5b131e8 a0000013 ffffffff c3b4dc00 
1e80: 00000000 00001002 00000000 00000000 bffffbfc 00000000 c1b51eb4 c00f8d44 
1ea0: c3b4dc00 00001043 c1b51ed4 c1b51eb8 c00fa3b8 c00f8cf8 00000000 00000000 
1ec0: c1b51f10 c1b51f00 c1b51f48 c1b51ed8 c0130288 c00fa368 00000014 c1b50000 
1ee0: 00000000 00000000 c3b4dc00 00008914 40001043 00000009 bffffe7b bffffd98 
1f00: 30627375 00000000 00000000 00000000 40001043 00000009 bffffe7b bffffd98 
1f20: 00008914 bffffbfc c1b84d60 00000004 c001c964 bffffbfc c205abe0 c1b51f64 
1f40: c1b51f4c c01328a0 c012ff94 c019e858 00008914 00000041 c1b51f78 c1b51f68 
1f60: c00f1468 c013258c ffffffe7 c1b51fac c1b51f7c c005a6f0 c00f1450 c1b51fa4 
1f80: c1b51f8c bffffbfc bffffc84 00000041 00000036 c001c964 c1b50000 bffffd9c 
1fa0: 00000000 c1b51fb0 c001c7e0 c005a41c bffffbfc c0022d9c 00000004 00008914 
1fc0: bffffbfc 00001043 bffffbfc bffffc84 00000041 0001cfc4 00000003 00000000 
1fe0: bffffd9c bffffc84 0001d3f8 bffffbfc 00009450 400dfb34 60000010 00000004 
Backtrace: invalid frame pointer 0x00001043
Code: e1a08000 e1a0b001 (e5915064) e590a05c e10f6000 
Segmentation fault
root@(none):/tmp/t1/tmp/drivers# 


При попытке опять вызвать ifconfig - всё глухо повисает...



Есть несколько решений влоб: вывести вторую консоль (хотя бы RX). Проблема очевидна - куда её выводить. Либо попробовать вообще альтернативную прошивку. Проблема осложняется тем, что по моему она работает с sd-карты и грузится кнопкой 7. А я в процессе опытов перебил шлейф от клавы (впрочем это лечится). Мне тут сказали, что я упоротый, что занимаюсь такими вещами :)


З.Ы. У меня тут эпичная шляпа случилась: запустил обновление системы с 10.04 на 12.04 (жалею до сих пор). В середине обновления что-то коротнуло в компе и он вырубился. Результат - слетевшая rootfs. Но слава богу востанавливаемая.
Tags: arm, linux, prs-505, Опыты
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 19 comments