天嵌 ARM开发社区

 找回密码
 注册
查看: 6834|回复: 4

移植TQ2440的触摸屏驱动+ADC驱动到TQ2416内核

[复制链接]
heycare 发表于 2012-12-17 00:23:33 | 显示全部楼层 |阅读模式
硬件:TQ2416核心板+赛特勒底板
软件:TQ2416光盘中的Linux-3.1内核+文件系统

经过测试,TQ2416的内核运行与赛特勒底板的硬件平台,触摸屏会出现问题,主要为一段时间后触摸屏不响应.而TQ2440的内核则不会,所以初步考虑将TQ2440的触摸屏驱动及ADC驱动到TQ2416内核中.

1、复制TQ2440内核中drivers/input/touchscreen/tq2440_ts.c到TQ2416内核的drivers/input/touchscreen/目录下
drivers/input/touchscreen/添加tq2440_ts.c,并且修改Makefile(链接tq2440_ts.o,以及取消连接s3c_ts.o)
2、编译出现如下错误:

drivers/built-in.o: In function `touch_timer_fire':
clkdev.c:(.text+0xfb910): undefined reference to `ADC_LOCK'
drivers/built-in.o: In function `stylus_updown':
clkdev.c:(.text+0xfb97c): undefined reference to `ADC_LOCK'
make: *** [.tmp_vmlinux1] Error 1

这是因为TQ2440的触摸屏驱动依赖了ADC驱动,它们在不同的模块中,所以仍需要移植TQ2440的ADC驱动到TQ2416内核中

3、drivers/char/添加2440内核中的EmbedSky_adc.c 和tq2440_adc.h,修改Makefile(链接EmbedSky_adc.o,以及取消连接tq2416_adc.o),编译出错
drivers/char/EmbedSky_adc.c: In function 'adcdone_int_handler':
drivers/char/EmbedSky_adc.c:85: error: 'TASK_INTERRUPTIBLE' undeclared (first use in this function)
drivers/char/EmbedSky_adc.c:85: error: (Each undeclared identifier is reported only once
drivers/char/EmbedSky_adc.c:85: error: for each function it appears in.)
drivers/char/EmbedSky_adc.c: In function 'tq2440_adc_read':
drivers/char/EmbedSky_adc.c:96: error: 'ADC_LOCK' undeclared (first use in this function)
drivers/char/EmbedSky_adc.c:100: error: 'TASK_INTERRUPTIBLE' undeclared (first use in this function)
drivers/char/EmbedSky_adc.c:100: error: implicit declaration of function 'signal_pending'
drivers/char/EmbedSky_adc.c:100: error: implicit declaration of function 'schedule'
drivers/char/EmbedSky_adc.c: At top level:
drivers/char/EmbedSky_adc.c:210: error: 'ADC_LOCK' undeclared here (not in a function)
drivers/char/EmbedSky_adc.c:210: warning: type defaults to 'int' in declaration of 'ADC_LOCK'
make[2]: *** [drivers/char/EmbedSky_adc.o] Error 1
make[1]: *** [drivers/char] Error 2
make: *** [drivers] Error 2

使用source insight工具查找TASK_INTERRUPTIBLE的定义,发现TASK_INTERRUPTIBLE在头文件sched.h中被定义。在EmbedSky_adc.c添加头文件 #include <linux/sched.h>
再次编译内核,出现以下错误

drivers/char/EmbedSky_adc.c: In function 'tq2440_adc_read':
drivers/char/EmbedSky_adc.c:96: error: 'ADC_LOCK' undeclared (first use in this function)
drivers/char/EmbedSky_adc.c:96: error: (Each undeclared identifier is reported only once
drivers/char/EmbedSky_adc.c:96: error: for each function it appears in.)
drivers/char/EmbedSky_adc.c: At top level:
drivers/char/EmbedSky_adc.c:210: error: 'ADC_LOCK' undeclared here (not in a function)
drivers/char/EmbedSky_adc.c:210: warning: type defaults to 'int' in declaration of 'ADC_LOCK'

TQ2440中的ADC驱动定义了信号量ADC_LOCK,Linux-kernel-3.1定义信号量的宏定义由之前旧的版本DECLARE_MUTEX()变成了DEFINE_SEMAPHORE()。
EmbedSky_adc.c 49行
DECLARE_MUTEX(ADC_LOCK);
改成
DEFINE_SEMAPHORE(ADC_LOCK);

4、通过以上修改,编译成功。但是启动Linux后发现触摸屏中断ADC注册不成功,导致触摸屏驱动注册也不成功
tq2440_ts.c: Could not allocate ts IRQ_ADC !
通过命令cat /proc/interrupts得到以下结果

...
80:          0   s3c-adc  s3c24xx-adc
...
分析原因,应该是TQ2416的内核之前已经注册过ADC中断,在初始化移植过来的触摸屏中断时,再次注册ADC不成功。
5、在TQ2416的内核中,有一个宏是与触摸屏和ADC相关的CONFIG_TOUCHSCREEN_S3C
通过souce insight查找CONFIG_TOUCHSCREEN_S3C的定义,找不到。只能在源码中去掉该宏的定义
在arch/arm/s3c2416/mach-tq2416.c文件中加入
#undef CONFIG_TOUCHSCREEN_S3C

6、通过以上步骤,成功将TQ2440的触摸屏驱动移植到TQ2416内核中。测试后,触屏效果明显比之前好很多,且不会死机。

评分

参与人数 1 +15 收起 理由
艾那的小强 + 15 很给力!

查看全部评分

TQ-lkp 发表于 2012-12-17 09:01:43 | 显示全部楼层
Hens007 发表于 2013-1-7 17:05:31 | 显示全部楼层
楼主太强大了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-4-19 17:49 , Processed in 1.062500 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表