RV1126驱动移植笔记:我是如何搞定JD9366触摸屏的(从源码分析到DTS调试)
RV1126驱动移植实战JD9366触摸屏从源码解析到DTS调试全记录第一次拿到JD9366触摸屏驱动源码时我盯着满屏的寄存器定义和i2c传输函数发了半小时呆——这堆代码到底该怎么塞进RV1126的内核为什么别人的移植笔记总是轻描淡写地略过最关键的调试环节本文将用真实踩坑经历还原一个驱动工程师的完整思考路径。1. 驱动源码的逆向工程从黑盒到白盒面对来路不明的驱动源码我习惯先用ctags建立代码索引。在kernel目录下执行ctags -R drivers/input/touchscreen/jd9366/这个不起眼的操作能让你在Vim里用Ctrl]跳转到函数定义。重点关注三个核心结构体struct jd9366_data { struct i2c_client *client; struct input_dev *input; struct gpio_desc *reset_gpio; struct gpio_desc *irq_gpio; //... }; struct jd9366_ops { int (*init)(struct jd9366_data *data); int (*read)(struct jd9366_data *data, u8 reg, u16 *val); //... }; static const struct of_device_id jd9366_of_match[] { { .compatible jian-ding,jd9366 }, {} };关键排查点对比内核版本差异时特别要注意struct gpio_desc在4.19内核后的API变化。老驱动可能还在用gpio_request而新内核要求使用gpiod_get系列函数。当编译报错提示implicit declaration of function时我整理了一份头文件对照表头文件4.4内核位置5.10内核位置gpio.hlinux/gpio.hlinux/gpiod.hinterrupt.hlinux/interrupt.h同左input.hlinux/input.h同左提示用git grep 函数名可以快速定位内核中该函数的定义位置判断是否被废弃或改名。2. DTS配置的硬件思维从原理图到设备树拿到硬件原理图后先在图纸上标注三个关键信号I2C总线编号如i2c1中断引脚GPIO1_A5复位引脚GPIO3_D2对应的DTS配置应该这样写i2c1 { status okay; clock-frequency 400000; jd9366: touchscreen5d { compatible jian-ding,jd9366; reg 0x5d; interrupt-parent gpio1; interrupts 5 IRQ_TYPE_EDGE_FALLING; reset-gpios gpio3 26 GPIO_ACTIVE_LOW; // GPIO3_D2换算为(3-0)*32 (26-0)26 //... }; };引脚换算陷阱Rockchip的GPIO编号计算方式很特别。GPIO3_D2对应的编号是(3-0)*32 (26-0) 26因为GPIO组号从0开始GPIO0~GPIO3对应0~3每组有32个引脚A00, A11,..., D731注意用cat /proc/interrupts可以查看中断是否成功注册如果显示0次触发可能是中断极性配置错误。3. 内核菜单配置的隐藏逻辑执行make menuconfig时我发现触摸屏驱动居然不在常规位置。原来Rockchip对输入设备做了特殊分类Device Drivers --- Input device support --- [*] Touchscreens --- * JianDing JD9366 touchscreen controller编译报错急救包错误类型解决方案undefined reference to检查Makefile的obj-y是否包含驱动missing header对比内核版本添加正确头文件i2c transfer failed用i2cdetect确认从机地址遇到i2c i2c-1: sendbytes: error -110这类错误时先用示波器抓取波形。如果没有设备可以echo 1 /sys/module/i2c_dev/parameters/parameters/debug dmesg -w | grep i2c4. 调试技巧从内核日志到硬件信号当触摸屏完全没反应时我的排查链条是这样的电源检查cat /sys/class/regulator/regulator.5/microvolts确认3.3V电压正常I2C通信测试i2cdetect -y 1应该能看到0x5d地址中断触发测试cat /proc/interrupts | grep jd9366触摸屏幕时计数应该增加原始数据抓取evtest /dev/input/event2正常会输出坐标信息最坑的故障有中断但无坐标数据。最后发现是驱动里的input_report_abs()参数顺序错了正确的应该是input_report_abs(input, ABS_MT_POSITION_X, x); input_report_abs(input, ABS_MT_POSITION_Y, y);记得在probe函数里设置正确的输入设备属性__set_bit(INPUT_PROP_DIRECT, input-propbit); input_set_abs_params(input, ABS_MT_POSITION_X, 0, 800, 0, 0); input_set_abs_params(input, ABS_MT_POSITION_Y, 0, 1280, 0, 0);5. 性能调优从能用
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2589749.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!