Тупик Карла Маркса
Oct. 8th, 2012 05:39 pmЧто-то я столько сил положил на вывод на экран хоть что-нибдь, плюс за выходные ни разу не отдохнул, т.к. просто утоп в домашних делах. В результате чувствую себя выжатым лимоном, который переехал бронепоезд. По сему дальнейшие ковыряния провожу вяленько, в свободное от работы время.
Обо всём попорядку.
1. Было проверенно и доказано, что для картинки выводимой на экран значащим является только старший ниббл. А конкретно старшие три бита цвета. Остальные могут принимать любое значение и на изображение не влияют.
Это означает, что можно передавать по UART только старшую часть байта, которую удобно кодировать символами от 0 до F (HEX).
Была набросана небольшая программа (текст под катом), которая преобразует любой файл в поток старших ниблов
Программа работает отлично, но... попытка передать что-либо затыкается. Точнее нет. Если сделать так:
./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
Первая попытка загрузить драйвер у меня привела к панике ядра:
Если попробовать сначала загрузить g_zero.o (даже не знаю, что за драйвер), то он на него ругнётся, но не запаникует. Потом можно даже загрузить с неким успехом g_ether.o
Правда тут не всё так радужно.
Попробуем снова выгрузить-загрузить и поднять интерфейс:
При попытке опять вызвать ifconfig - всё глухо повисает...
Есть несколько решений влоб: вывести вторую консоль (хотя бы RX). Проблема очевидна - куда её выводить. Либо попробовать вообще альтернативную прошивку. Проблема осложняется тем, что по моему она работает с sd-карты и грузится кнопкой 7. А я в процессе опытов перебил шлейф от клавы (впрочем это лечится). Мне тут сказали, что я упоротый, что занимаюсь такими вещами :)
З.Ы. У меня тут эпичная шляпа случилась: запустил обновление системы с 10.04 на 12.04 (жалею до сих пор). В середине обновления что-то коротнуло в компе и он вырубился. Результат - слетевшая rootfs. Но слава богу востанавливаемая.
Обо всём попорядку.
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. Камрад
Первая попытка загрузить драйвер у меня привела к панике ядра:
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. Но слава богу востанавливаемая.