Что-то я столько сил положил на вывод на экран хоть что-нибдь, плюс за выходные ни разу не отдохнул, т.к. просто утоп в домашних делах. В результате чувствую себя выжатым лимоном, который переехал бронепоезд. По сему дальнейшие ковыряния провожу вяленько, в свободное от работы время.
Обо всём попорядку.
1. Было проверенно и доказано, что для картинки выводимой на экран значащим является только старший ниббл. А конкретно старшие три бита цвета. Остальные могут принимать любое значение и на изображение не влияют.
Это означает, что можно передавать по UART только старшую часть байта, которую удобно кодировать символами от 0 до F (HEX).
Была набросана небольшая программа (текст под катом), которая преобразует любой файл в поток старших ниблов
/* showpic.c */
#include
#include
#include
#include
#include
#include
#include
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. Но слава богу востанавливаемая.