- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
/* IOCTL calls for E-Ink paper update */
#define EPAPER_UPDATE_LOCAL 0x101 /** Update localarea */
#define EPAPER_UPDATE_PART 0x102 /** ??? */
#define EPAPER_UPDATE_FULL 0x103 /** Fully update */
#define EPAPER_UPDATE_DISPLAY_QT 0x120d /** Update all display
/* Helper FB update function */
int epaper_update_helper(int fb, unsigned long int ioctl_call, void *mode)
{
if (framebuffer_descriptor >= 0)
{
errno=0;
ioctl(fb, ioctl_call, mode);
// sleep_timer=sleep_timeout; // Reset sleep timer on every display refresh = we are not have any constantly refreshing display parts now!
return errno;
}
return TRUE;
}
void epaperUpdate(__attribute__((unused)) unsigned long int ioctl_call, __attribute__((unused)) void *mode)
{
#ifndef __amd64
int ioctl_result;
#endif //__amd64
TRACE("Called void epaperUpdate()\n");
if (enable_refresh == FALSE)
{
TRACE("Display refresh was locked, IGNORED!\n");
(void) ioctl_call;
(void) mode;
return;
}
#ifndef __amd64
/* Иначе запись в видеопамять не успевает завершиться и получаем верхний левый угол новой картинки и нижний правый - прежней. */
// if (hw_platform != HW_PLATFORM_SIBRARY_GTK) {
// const struct timespec delay = {0, QT_REFRESH_DELAY};
// nanosleep(&delay, NULL);
// }
ioctl_result=epaper_update_helper(framebuffer_descriptor, ioctl_call, mode);
#ifdef debug
if (ioctl_result != 0)
{
TRACE("Display refresh ioctl call FAILED %d (%s)\n", ioctl_result, strerror(ioctl_result));
// GTK прошивка, обновление от Qt: 1 (Операция не позволяется)
// Qt прошивка, обновление от GTK: 22 (Недопустимый аргумент)
}
#else
(void) ioctl_result;
#endif
#endif
return;
}
int detect_refresh_type (void)
{
int mode=3;
#if 0
struct mxcfb_update_data data = {
.update_region =
{ .top = 0,
.left = 0,
.width = 1,
.height = 1
},
.update_mode = UPDATE_MODE_FULL,
.update_marker = 0,
.waveform_mode = WAVEFORM_MODE_AUTO,
.temp = TEMP_USE_AMBIENT,
.flags = 0
};
#endif
if (epaper_update_helper(framebuffer_descriptor, EPAPER_UPDATE_DISPLAY_QT, &mode) == 0)
{
refresh_type=REFRESH_NEW;
TRACE("Display refresh was successed, new\n");
}
else if (epaper_update_helper(framebuffer_descriptor, EPAPER_UPDATE_FULL, &mode) == 0)
{
refresh_type=REFRESH_LEGACY;
TRACE("Display refresh was successed, legacy\n");
}
// else if (epaper_update_helper(framebuffer_descriptor, MXCFB_SEND_UPDATE_ORG, &data) == 0)
// {
// refresh_type=REFRESH_KOBO;
// TRACE("Display refresh was successed, kobo\n");
// }
else
{
TRACE("Display refresh was not detected!\n");
}
return (refresh_type);
}
Есть читалки на электронных чернилах типа Sibrary G5/G6/G10/G51, Digma e500/e600/q1000, Boeye и Ergo Book с теми же цифрами, что у Дигмы, Qumo Libro/Colibri, G-mini M6, Ritmix RBK700 и даже некий EvroMedia E-підручник. Все они на одном железе и с похожей прошивкой (Линукс с библиотеками GTK). Зроблены на процессоре Слмсунг S3C2416 рахит-тинктуры ARMv5TEJ (да, как у бабушкофона Philips Xenium, только у него вроде Медиатек, а не Гнусмас).
Так вот, поскольку лепестрические чернила — птица гордая, пока не пнёшь, не полетит, прямо из прикладной программы нужно отправлять ioctl на обновление экрана (посреди кода для GTK или Qt, гы), причём есть варианты, обновить весь экран (медленно, но результат чистый) или только заданную область (быстро, но может появиться «грязь» на границе зоны обновления).
во-первых, экспортировать ioctl неприлично: надо делать SDK нормальный.
во-вторых, эта задача решается же во всех оконных фреймворках: ты помечаешь область как "грязную", и тред в фоне ее обновляет. Я уверен, что `markDirty()` в Qt или `gdk_window_invalidate_region` в GTK что-то такое должны делать, не?
какая синхронизация с обратным кодом луча ))
Всё, что есть на данный момент, это sibrary-toolchain.tbz2 и «SZBOEYE SDK USER GUIDE-en.docx», которые лежали на китайском FTP, который уже не работает. Как я их нашёл и скачал, это отдельная история. Там в основном компилятор для armv5, а специальных библиотек для е-инка я не заметил, только рекомендацию в docx-файле делать всё через ioctl.
Раскопки начал с этого бложика:
https://omlin.blogspot.com/2011/02/qumo-libro.html?m=1
Китайский фтп сдох, как я уже сказал, paccbet.ru тоже, свои файлы @omlin проебал после того, как разбил экран у читалки и потерял к читалкам интерес.
7.4 Audio driver
7.4.1 Open driver
fd = open("/dev/audio_sw", O_RDWR);
7.4.2 Audio channel switch
7.4.2.1 Playback from speaker
ioctl (fd, 2, 0);
7.4.2.2 Playback from headphone
ioctl (fd, 3, 0);
7.4.2.3 FM radio from headphone
ioctl (fd, 5, 0);
7.4.2.4 Capture from mic
ioctl (fd, 4, 0);
7.4.2.5 Capture from FM radio
ioctl (fd, 11,0);
7.4.2.6 Close all channel
ioctl (fd, 6, 0);
Бывает датчик ускорения (вероятно, чтобы автоматически менять ориентацию изображения при наклоне экрана). Из «SDK»:
7.7 Gsensor driver
#define AXIS_ACCEL_ON 1
#define AXIS_ACCEL_OFF 2
#define AXIS_ACCEL_READ 3
Open gsensor:
fd=Open(“/dev/axis_accel”,O_RDWR);
Turn on the gsensor:
ioctl(fd,AXIS_ACCEL_ON);
Turn off the gsensor:
ioctl(fd,AXIS_ACCEL_OFF);
Get the state of ereader:
ret = Ioctl(fd,AXIS_ACCEL_READ);
the value of ret bits[4:2] dir_status:
identify direction:
dir_status = 0,unknow
dir_status = 1, up
dir_status = 2, down
dir_status = 3, left
dir_status = 4, right
Часики:
Open RTC driver:
fd = open(“/dev/rtc0”, O_RDWR)
RTC read :
ioctl(fd, RTC_RD_TIME, &tm);
RTC write :
ioctl(fd, RTC_SET_TIME, &tm);
Set alarm time :
ioctl(fd, RTC_ALM_SET, &tm);
Close RTC device:
close(fd);
7.11 LED driver
#define GREEN_LED_ON 0x3
#define GREEN_LED_OFF 0x4
#define GREEN_LED_FLASH 0x5
Open led:
fd=open(“/dev/boeye_leds”,O_RDWR);
Turn on the green led:
ioctl(fd, GREEN_LED_ON);
Turn off the green led:
ioctl(fd, GREEN_LED_OFF);
Flash the green led:
ioctl(fd, GREEN_LED_FLASH);
У некоторых моделей есть симка и вайфай. Надо ли говорить, что включение/выключение модема производится тоже через ioctl.
HW_PLATFORM_SIBRARY_GTK
QT_REFRESH_DELAY
В одном участке кода! Что вижу, о том пою.
Меблятека
also
>RIBRARY
Am: We have elections every four years
Jap: I have erlection everly morlning
А китайцы «р» и «ж» не различают.
https://github.com/S-trace/eView
Оказывается, если в конце запроса добавить -nigger, то блок с ИИ пропадает.
ГОЛОГУБ!!!
1. Написать знак минуса и слово, которое нужно исключить (нужно подобрать слово, которого точно не будет в ответе). «ИИ» не умеет обрабатывать такие сложные запросы.
2. Добавить любое стоп-слово, например, f-word или n-word. Есть риск, что оно появится в ответе.
Метод «-nigger» же объединяет оба перечисленных выше метода для надёжности. Причём обычно даже без побочных эффектов, если только ты не ищешь ниггеров специально.