Что-то в связи с болезнью никак не могу добраться до ЖЖ, собраться с мыслями и написать данный простенький пост. Грёбаная осень!
Забегая вперёд скажу, что мне удалось по UART передать картинку, всё благодаря товарищу
paracloud, который мне точно указал что делать в этом посте
http://dlinyj.livejournal.com/609986.html .
Говоря простым языком, нужно настроить консоль. Я набросал небольшую програмку
#include
...
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
#include
#include
#include /* File control definitions */
#include /* POSIX terminal control definitions */
#include
#include
#include /* String function definitions */
#include
#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 {
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 до появления данных.
Не знаю, что я делаю не так. Пограмма честно отрабатывает, но выводит тупо чёрный экран, по завершению приёма. Увы...
Надо разбираться дальше.