dlinyj: (Default)
[personal profile] 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. Камрад [livejournal.com profile] 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. Но слава богу востанавливаемая.
This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

January 2026

S M T W T F S
    123
456 78910
11121314151617
18192021222324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 22nd, 2026 10:23 am
Powered by Dreamwidth Studios