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

相关新闻

G-Helper技术架构深度解析:开源华硕笔记本硬件控制终极方案

G-Helper技术架构深度解析:开源华硕笔记本硬件控制终极方案

G-Helper技术架构深度解析:开源华硕笔记本硬件控制终极方案 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenboo…

2026/10/13 17:17:57 阅读更多 →
MoE架构与本地部署实践:从MiMo-V2-Pro看大模型技术演进与应用

MoE架构与本地部署实践:从MiMo-V2-Pro看大模型技术演进与应用

1. 项目概述:天才少女与她的“出圈”大模型最近,一个名字在AI圈内被反复提及:罗福莉。伴随这个名字一起“出圈”的,是她主导或参与开发的“MiMo-V2-Pro”模型。一时间,关于“天才少女”、“震动AI圈”、“MiMo-V2-Pro性…

2026/10/12 5:08:18 阅读更多 →
如何3分钟掌握暗黑3自动化助手:从手忙脚乱到轻松刷图的终极指南

如何3分钟掌握暗黑3自动化助手:从手忙脚乱到轻松刷图的终极指南

如何3分钟掌握暗黑3自动化助手:从手忙脚乱到轻松刷图的终极指南 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面,可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper 你是否在暗黑破坏神3的高…

2026/10/13 18:19:40 阅读更多 →

最新新闻

全铝构件筑雅韵 一方门庭显门第

全铝构件筑雅韵 一方门庭显门第

在南昌的高端墅区,一方苏式门头便是别墅的第一张名片。白墙黛瓦承托飞檐翘角,铜韵大门映衬雕花漏窗,方寸门庭之间,藏着苏式建筑的温婉雅致,也显露出居者的品位与门第。这座兼具东方气韵与现代品质的苏式别墅门头,摒弃传统实木与陶瓦材质,采用全铝合金仿古构件体系打造 —— 从屋…

2026/10/13 19:47:38 阅读更多 →
PS5串流全攻略:从局域网到公网的AnyPS5搭建指南

PS5串流全攻略:从局域网到公网的AnyPS5搭建指南

你们的PS5是不是也在客厅吃灰?当初买的时候想着“大电视配大作,爽就完事了”,结果真玩起来发现自己根本没那么多时间正襟危坐在电视前。躺在床上想玩一会儿,不想开机翻电视;出差住酒店,对着那个大电视不知道…

2026/10/13 19:47:38 阅读更多 →
2026年LED数码管定制行业趋势与品牌选择指南

2026年LED数码管定制行业趋势与品牌选择指南

2026年LED数码管定制行业背景与痛点2026年,国内LED光电元器件市场规模持续增长,据行业公开数据推导,整体市场规模已突破1300亿元。随着下游消费电子、汽车电子、医疗电子等领域产品升级,对LED数码管的定制化需求占比提升至45%以上…

2026/10/13 19:47:38 阅读更多 →
微信小程序快递管理平台设计与实现:SSM后端全栈开发实践指南

微信小程序快递管理平台设计与实现:SSM后端全栈开发实践指南

最近被问得最多的项目类型,就是“基于微信小程序的快递管理平台”。别看它看起来是个常见的课设/毕设题目,真正动手做起来,牵扯到的点其实不少:小程序端怎么跑起来、SSM后端怎么搭、订单状态怎么流转才不会乱、取件码怎么生成才安…

2026/10/13 19:47:38 阅读更多 →
AI 生成稿件后怎么实现自动分发?AI 智能体对接自媒体矩阵管线方案

AI 生成稿件后怎么实现自动分发?AI 智能体对接自媒体矩阵管线方案

一、企业痛点:AI 生成稿件,多平台分发仍困在人工复制粘贴随着 AI 智能体落地普及,很多企业已经用大模型完成稿件、文案、短视频脚本的批量生产。但内容生产完成之后,运营人员依然要重复:复制稿件、上传素材、填写标题标…

2026/10/13 19:47:38 阅读更多 →
NumPy向量化:广播、布尔索引与ufunc性能实战

NumPy向量化:广播、布尔索引与ufunc性能实战

1. 为什么“03”必须聊矢量化:从一段慢到离谱的循环说起写这个系列第三篇之前,我刚帮一位同事排查了一段代码。场景是用numpy数组处理一批传感器数据,大概几十万行,要做的事也不复杂:按时间窗统计滑动均值,…

2026/10/13 19:46:38 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →