Удача с электронной книгой.
Oct. 31st, 2012 01:36 pmЧто-то в связи с болезнью никак не могу добраться до ЖЖ, собраться с мыслями и написать данный простенький пост. Грёбаная осень!
Забегая вперёд скажу, что мне удалось по UART передать картинку, всё благодаря товарищу
paracloud, который мне точно указал что делать в этом посте http://dlinyj.livejournal.com/609986.html .
Говоря простым языком, нужно настроить консоль. Я набросал небольшую програмку
По сути программа перенастраивает терминал и отключает эхо. После чего "вслепую" вводим на книжке
cat /dev/tty > result.raw
а на компе вводим
sudo cat img.raw > /dev/ttyUSB0
И спустя, примерно, минуту получаем исходный файл на книжке. Консоль удаётся вернуть только после перезагрузки книжки. Это файл вполне себе видится и выводится на экран без потерь и артефактов.
Это был топорный тестовый вариант, в стиле "а можно ли?"
Далее, я решил написать программу, которая не создаёт промежуточный файл, а принимает данные в буфер, а затем этот буфер копирует во фреймбуффер.
Здесь настраивается блокирующее чтение:
fcntl(0, F_SETFL, 0); //read com-port is the bloking
Которое не делает бесконечный цикл, а блокирует оператор read до появления данных.
Не знаю, что я делаю не так. Пограмма честно отрабатывает, но выводит тупо чёрный экран, по завершению приёма. Увы...
Надо разбираться дальше.
Забегая вперёд скажу, что мне удалось по UART передать картинку, всё благодаря товарищу
Говоря простым языком, нужно настроить консоль. Я набросал небольшую програмку
#include <stdio.h> ... int main (int argc, char* argv[]) { struct termios oldtty, newtty; fcntl(0, F_SETFL, 0); //read com-port is the bloking tcgetattr(0, &oldtty); newtty = oldtty; newtty.c_iflag = IGNBRK; newtty.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN); newtty.c_oflag = 0; newtty.c_cflag &= ~PARENB; newtty.c_cflag |= CS8; newtty.c_cc[VMIN] = 1; newtty.c_cc[VTIME] = 1; tcsetattr(0, TCSANOW, &newtty); return 0; }
По сути программа перенастраивает терминал и отключает эхо. После чего "вслепую" вводим на книжке
cat /dev/tty > result.raw
а на компе вводим
sudo cat img.raw > /dev/ttyUSB0
И спустя, примерно, минуту получаем исходный файл на книжке. Консоль удаётся вернуть только после перезагрузки книжки. Это файл вполне себе видится и выводится на экран без потерь и артефактов.
Это был топорный тестовый вариант, в стиле "а можно ли?"
Далее, я решил написать программу, которая не создаёт промежуточный файл, а принимает данные в буфер, а затем этот буфер копирует во фреймбуффер.
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> /* File control definitions */ #include <termios.h> /* POSIX terminal control definitions */ #include <sys/ioctl.h> #include <sys/mman.h> #include <string.h> /* String function definitions */ #include <unistd.h> #define resultfile "result.img" #define FBIO_EINK_GET_TEMPERATURE 0x46A1 //Returns temperature in degree Celsius #define FBIO_EINK_DISP_PIC 0x46A2 //Displays picture int main (int argc, char* argv[]) { struct termios oldtty, newtty; char buffer[100]; printf ("Test recive data\n"); sleep(1); fcntl(0, F_SETFL, 0); //read com-port is the bloking //config UART tcgetattr(0, &oldtty); newtty = oldtty; newtty.c_iflag = IGNBRK; newtty.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN); newtty.c_oflag = 0; newtty.c_cflag &= ~PARENB; newtty.c_cflag |= CS8; newtty.c_cc[VMIN] = 1; newtty.c_cc[VTIME] = 1; tcsetattr(0, TCSANOW, &newtty); char *tmp; unsigned int count=0, i=0, l; ssize_t n; tmp=malloc(480000); while(count<480000) { n=read(0,buffer,50); count+=n; l=0; for(;i<n;i++) { tmp[i]=buffer[l]; l++; } } //write old config tcsetattr(0, TCSANOW, &oldtty); int *fb; int pio_fd = open ( "/dev/fb0", O_RDWR); int f_image = open ( argv[1], O_RDWR); //open file into arg int t= ioctl (pio_fd, FBIO_EINK_GET_TEMPERATURE, NULL); //configure framebuffer fb= mmap(0, 800*600, PROT_WRITE, MAP_SHARED, pio_fd, 0); //map device into memory memset(fb,0,800*600); //clear image ioctl (pio_fd, FBIO_EINK_DISP_PIC, 0); memcpy(fb,tmp,800*600); ioctl (pio_fd, FBIO_EINK_DISP_PIC, 0); close(pio_fd); return 0; }
Здесь настраивается блокирующее чтение:
fcntl(0, F_SETFL, 0); //read com-port is the bloking
Которое не делает бесконечный цикл, а блокирует оператор read до появления данных.
Не знаю, что я делаю не так. Пограмма честно отрабатывает, но выводит тупо чёрный экран, по завершению приёма. Увы...
Надо разбираться дальше.
no subject
Date: 2012-10-31 09:50 am (UTC):)
no subject
Date: 2012-10-31 09:56 am (UTC)no subject
Date: 2012-10-31 10:01 am (UTC)no subject
Date: 2012-10-31 10:01 am (UTC)no subject
Date: 2012-10-31 10:29 am (UTC)bloking -> blocking
и это причастие — зачем артикль?
Да и всё предложение у тебя примерно так звучит: «Читай ком-порт — это блокирование».
Можно было как-нибудь так: «read from (on) com-port is blocking», — или: «blocking read from (on) com-port».
А я бы, если б вообще написал, то: «use blocking I/O», — а остальное видно из контекста.
no subject
Date: 2012-10-31 10:30 am (UTC)