尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Kindle --FBInk绘图与zforce2 触摸应用开发

Kindle --FBInk绘图与zforce2 触摸应用开发 一、FBInk帧缓冲绘图FBInk是 Kindle/Kobo 电子墨水屏帧缓冲绘图工具可以直接在 eInk 屏幕输出文字、图片、进度条、局部刷屏、清屏无需调用系统 UI。 版本FBInk v1.24.0-161-gb7a8146设备识别信息前置[FBInk] 检测到 Kindle Basic 2 (0KA - 0x26A Eanab Heisenberg) [FBInk] 系统时钟频率100 Hz [FBInk] 屏幕DPI167 [FBInk] 帧缓冲600×8008位色深屏幕旋转 270°逆时针 [FBInk] 帧缓冲设备mxc_epdc_fb显存大小6537216字节行宽608字节 [FBInk] 默认字体 16×16基础8×8 IBM点阵字库 [FBInk] 默认文本区域37列 × 50行 [FBInk] 默认颜色前景黑色背景白色1、 文本位置控制参数基础语法fbink [参数] [文本内容...]参数全称说明-x NUM--col起始列默认 0负数代表从屏幕右侧倒数建议起始≥1 避免被边框遮挡-y NUM--row起始行默认 0负数代表从屏幕底部倒数建议起始≥1-X NUM--hoffset水平像素偏移叠加在行列之上可正负-Y NUM--voffset垂直像素偏移-m--centered文本水平居中-M--halfway垂直居中此时-y的数值是相对于屏幕中线的偏移量-p--padded两端填充空格配合-m实现整行居中铺满-r--rpadded右侧填充空格2、 文本外观控制参数参数全称说明-h--invert反转颜色背景色写字、前景色做底色黑底白字-f--flash刷新区域启用黑屏全刷eink 清除残影耗电更高-c--clear打印前全屏清屏仅清屏建议改用-k-k--cls清屏可全屏 / 局部矩形执行完成直接退出优先级最高-W MODE--waveform指定墨水刷新波形A2,DU,GC16,GL16,AUTOKindle 额外支持 REAGL、GC16_FAST 等-D--dither硬件抖动仅新设备支持-H--nightmode硬件全局反色和-h可叠加-b--norefresh只写入帧缓冲不触发屏幕刷新适合批量绘图最后统一刷新-w--wait阻塞等待内核刷新完成再返回-S NUM--size字体缩放倍数自动 0范围 1~45-F NAME--font内置点阵字体IBM、UNSCII、THIN、TEWI、ORP、TERMINUS 等-C COLOR--color文字颜色BLACK、GRAY1~GRAYE、WHITE-B COLOR--background文字底色-O--bgless不绘制文字背景只渲染文字轮廓-o--overlay叠加模式自动取底层像素反色优先级高于 - O-T--fgless不绘制前景文字3、特殊绘图模式进度条-P NUMfbink -P 35绘制全屏宽度 35% 进度条活动加载条-A NUMfbink -A 80~16负数自动循环动画局部 / 全屏刷新-s只触发屏幕刷新不修改画面fbink -s top20,left10,width500,height600 -W GC16图片显示-g / -i支持 PNG/JPG/BMP可缩放、对齐、软件抖动fbink -g file/mnt/us/test.png,halignCENTER,valignMIDDLE4、TrueType/OTF 矢量字体可以调用 ttf 自定义字体Kindle 内置 Caecilia支持 Markdown 粗体 / 斜体fbink -t regular/usr/java/lib/fonts/Caecilia_LT_65_Medium.ttf,size22,top50 自定义矢量文字5、输出调试与脚本参数-q静默关闭硬件检测日志-v详细日志-E输出绘制区域坐标方便 shell 脚本解析-e输出设备环境变量eval $(fbink -e)直接导入变量-d NUM守护进程模式启动 FIFO 管道/tmp/fbink-fifo持续接收文本输出适合仪表盘常驻刷新6、常用命令示例适配 Kindle Basic2 600×8001. 基础文字输出# 第10行、第2列输出文字 fbink -x 1 -y 10 Hello Kindle!2. 居中、黑底白字# 水平居中垂直居中向上偏移5行、反色高亮 fbink -pmh -y -5 System Information-m居中-p两端空格填充-h反转颜色-y -5距离底部向上 5 行3. 全屏清屏后打印文字fbink -c -m -M Clear4. 局部矩形清屏清空底部状态栏区域fbink -k top720,left0,width600,height805. 快速局部 GC16 刷新不绘图只消残影fbink -s top700,left0,width600,height100 -W GC166. 显示图片屏幕居中fbink -g file/mnt/us/img.png,halignCENTER,valignMIDDLE7. 启动守护进程常驻仪表盘推荐做动态面板# 最多容纳8行文本 PID$(fbink -d 8) # 向管道写入内容屏幕实时更新 echo CPU: 32% Battery:78% /tmp/fbink-fifo # 关闭 kill $PID8. 使用更大字体、更换内置字体fbink -F TEWI -S 2 -m Hello Kindle9. 无背景文字叠加不覆盖原有画面fbink -O -x 2 -y 2 Test...重要使用提示多次连续绘图建议搭配-b先写入缓冲区最后一次不带-b统一刷新减少墨水刷屏次数、减缓老化-W A2快速刷新残影重GC16/GL16灰度高质量刷新大量动态刷新尽量少用-fflash 黑屏全刷频繁全刷损耗屏幕多行文本文字直接写在同一个引号内不要分成多个参数多个参数配合-c只会显示最后一行坐标同时支持「绝对正数」和「负数反向计数」很适合做自适应底部状态栏。7、显示时间程序#include stdio.h #include unistd.h #include sys/types.h #include sys/wait.h #include time.h static int fbink_exec(char *const argv[]) { pid_t pid fork(); if (pid 0) { perror(fork); return -1; } if (pid 0) { execvp(argv[0], argv); perror(execvp fbink); _exit(127); } int status; waitpid(pid, status, 0); if(WIFEXITED(status)){ return WEXITSTATUS(status); } return -1; } //局部区域白色擦除 static int fbink_local_clear(void) { char * const argv[] { /usr/bin/fbink, -k, top400,left0,width600,height15, NULL }; return fbink_exec(argv); } //屏幕居中输出文本 static int fbink_center_text(const char *text) { char * const argv[] { /usr/bin/fbink, -m, -M, (char *)text, NULL }; return fbink_exec(argv); } int main(void) { char timestr[64]; time_t now; struct tm *tm_ptr; for(;;) { now time(NULL); tm_ptr localtime(now); snprintf(timestr, sizeof(timestr), %04d/%02d/%02d %02d:%02d, tm_ptr-tm_year 1900, tm_ptr-tm_mon 1, tm_ptr-tm_mday, tm_ptr-tm_hour, tm_ptr-tm_min); printf(%s\n, timestr); fbink_local_clear(); //局部擦除旧内容 fbink_center_text(timestr); //输出新时间 sleep(1); } return 0; }Linux 主机交叉编译arm-linux-gnueabi-gcc -marcharmv7-a -mtunecortex-a9 -msoft-float -mabiaapcs-linux show-time.c -o show-time上传程序scp ./show-time root192.168.1.4:/mnt/us/gcc-testkindle端运行#cd /mnt/us/gcc-test #./show-time二、kindle 触摸屏开发1、触摸屏设备设备节点确认cat /proc/bus/input/devices I: Bus0000 Vendor0000 Product0000 Version0000 N: Namezforce2 P: Physzforce2/input0 S: Sysfs/devices/platform/zforce2.0/input/input0 U: Uniq H: Handlersevent0 B: PROP2 B: EVb B: KEY6420 0 0 0 0 0 0 0 0 0 0 B: ABS2608000 0Kindle 8 (PW3)触摸驱动是zforce2不是 mtk‑tpd触摸设备节点/dev/input/event0。 zforce2 是多点触摸 MT protocol B使用ABS_MT_POSITION_X/ABS_MT_POSITION_Y。坐标说明zforce2 PW3屏幕分辨率 600 × 800ABS_MT_POSITION_X0 ~ 600ABS_MT_POSITION_Y0 ~ 800和 FBInk 绘图坐标完全兼容可以直接传给 fbink 的-x-y参数。⚠️zforce2 的关键特性没有 BTN_TOUCH 事件依靠ABS_MT_TRACKING_ID判断按下抬起tracking_id ! -1→ 手指按下tracking_id -1→ 手指抬起设备节点固定/dev/input/event0来自你/proc/bus/input/devices的Handlersevent0。程序打开 event0 后系统原生触摸会失效事件抢占程序退出后恢复。必须 root 权限打开/dev/input/event0。2、zforce2 触摸读取程序逻辑解析 Linux MT‑B 多点触摸协议读取手指按下、抬起、X/Y 坐标。#include stdio.h #include stdlib.h #include unistd.h #include fcntl.h #include errno.h #include linux/input.h #include sys/types.h #include sys/stat.h #define TOUCH_DEV /dev/input/event0 int main(void) { int fd; struct input_event ev; int x -1, y -1; int touch_active 0; fd open(TOUCH_DEV, O_RDONLY); if (fd 0) { perror(open /dev/input/event0 failed (need root!)); return EXIT_FAILURE; } printf(zforce2 touch reader. Tap screen, CtrlC exit.\n); for (;;) { ssize_t n read(fd, ev, sizeof(struct input_event)); if (n ! sizeof(struct input_event)) { perror(read event); continue; } switch (ev.type) { case EV_ABS: // MT多点触摸坐标 if (ev.code ABS_MT_POSITION_X) { x ev.value; } else if (ev.code ABS_MT_POSITION_Y) { y ev.value; } else if (ev.code ABS_MT_TRACKING_ID) { /* tracking_id !‑1:手指按下‑1:手指抬起 */ if(ev.value ! -1) { touch_active 1; printf(DOWN x%d y%d\n, x, y); } else { touch_active 0; printf(UP\n); } } break; case EV_SYN: // SYN_REPORT 一次上报结束 break; default: break; } } close(fd); return 0; }Linux 主机交叉编译arm-linux-gnueabi-gcc -marcharmv7-a -mtunecortex-a9 -msoft-float -mabiaapcs-linux touch-read.c -o touch-read上传程序scp ./touch-read root192.168.1.4:/mnt/us/gcc-testkindle端运行#cd /mnt/us/gcc-test #./touch-read DOWN x245 y330 UP DOWN x410 y520 UP
返回列表