Забегая вперёд скажу, что мне удалось по 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 до появления данных.
Не знаю, что я делаю не так. Пограмма честно отрабатывает, но выводит тупо чёрный экран, по завершению приёма. Увы...
Надо разбираться дальше.