【Linux高级驱动】触摸屏驱动的移植
触摸屏驱动的移植
流程
注意:看框架图
1.添加input.c组件
Device Drivers --->
Input device support --->
Generic input layer (needed for keyboard, mouse, ...)
2.添加evdev.c组件
Input device support --->
<*> Event interface
3.添加s3c2410_ts.c触摸屏驱动
修改driver/input/touchscreen/Kconfig
tristate "Samsung S3C2410/generic touchscreen input driver"
depends on ARCH_S3C2410 || SAMSUNG_DEV_TS || ARCH_S5PC100 //后面的ARCH_S5PC100为新添加的
select S3C_ADC
help
Say Y here if you have the s3c2410 touchscreen.
If unsure, say N.To compile this driver as a module, choose M here: the
module will be called s3c2410_ts
配置内核选项
Input device support --->
-*- Generic input layer (needed for keyboard, mouse, ...)
[*] Touchscreens --->
<*>Samsung S3C2410/generic touchscreen input driver
4.添加设备资源(dev-ts.c)
vi arch/arm/mach-s5pc100/Kconfig
bool "SMDKC100"
select CPU_S5PC100
select S3C_DEV_FB
select S3C_DEV_I2C1
select S3C_DEV_HSMMC
select S3C_DEV_HSMMC1
select S3C_DEV_HSMMC2
select S5PC100_SETUP_FB_24BPP
select S5PC100_SETUP_I2C1
select S5PC100_SETUP_SDHCI
select S3C_DEV_LED
select S3C_DEV_RTC
select SAMSUNG_DEV_TS //添加的内容
help
Machine support for the Samsung SMDKC100
vi arch/arm/mach-s5pc100/mach-smdkc100.c
.oversampling_shift ,
};
static struct platform_device *smdkc100_devices[] __initdata = {
&s3c_device_i2c0,
&s3c_device_i2c1,
&s3c_device_fb,
&s3c_device_hsmmc0,
&s3c_device_hsmmc1,
&s3c_device_hsmmc2,
&smdkc100_lcd_powerdev,
&s5pc100_device_iis0,
&s5pc100_device_ac97,
#ifdef CONFIG_DM9000
&s5pc100_device_dm9000,
#endif
&fsled_device,
&s3c_device_rtc,
&s3c_device_ts, //添加的内容
};
static void __init smdkc100_machine_init(void)
{
...
s3c24xx_ts_set_platdata(&s5pc_tscfg); //s3c_device_ts.dev.platform_data =&s5pc_tscfg
...
}
5.修改头文件
vi arch/arm/mach-s5pc100/include/mach/map.h
6.添加adc资源(dev-adc.c)
vi arch/arm/mach-s5pc100/Kconfig
bool "SMDKC100"
select CPU_S5PC100
select S3C_DEV_FB
select S3C_DEV_I2C1
select S3C_DEV_HSMMC
select S3C_DEV_HSMMC1
select S3C_DEV_HSMMC2
select S5PC100_SETUP_FB_24BPP
select S5PC100_SETUP_I2C1
select S5PC100_SETUP_SDHCI
select S3C_DEV_LED
select S3C_DEV_RTC
select SAMSUNG_DEV_TS
select SAMSUNG_DEV_ADC //添加的内容
help
Machine support for the Samsung SMDKC100
vi arch/arm/mach-s5pc100/mach-smdkc100.c
&s3c_device_i2c0,
&s3c_device_i2c1,
&s3c_device_fb,
&s3c_device_hsmmc0,
&s3c_device_hsmmc1,
&s3c_device_hsmmc2,
&smdkc100_lcd_powerdev,
&s5pc100_device_iis0,
&s5pc100_device_ac97,
#ifdef CONFIG_DM9000
&s5pc100_device_dm9000,
#endif
&fsled_device,
&s3c_device_rtc,
&s3c_device_ts,
&s3c_device_adc //添加的内容
};
测试方式
测试方法1.驱动调试
在触摸屏驱动中s3c2410_ts.c文件的,触摸屏中断服务程序中添加如下代码
{
printk(KERN_INFO "%s():%d\n",__func__,__LINE__);
...
}
当点击触摸屏的时候,出现如下现象:
s3c_adc_start: failed to find adc //找不到ADC
问题解决:分析s3c_adc_start函数
if (!adc) {
printk(KERN_ERR "%s: failed to find adc\n", __func__);
return -EINVAL;
}
搜索adc_dev
adc_dev = adc;
static struct platform_device_id s3c_adc_driver_ids[] = {
{
.name = "s3c24xx-adc",
.driver_data = TYPE_S3C24XX,
},{
.name = "s3c64xx-adc",
.driver_data = TYPE_S3C64XX,
},
{ }
};
static struct platform_driver s3c_adc_driver = {
.id_table = s3c_adc_driver_ids, //按id.name匹配
.driver = {
.name = "s3c-adc",
.owner = THIS_MODULE,
},
.probe = s3c_adc_probe,
.remove = __devexit_p(s3c_adc_remove),
.suspend = s3c_adc_suspend,
.resume = s3c_adc_resume,
};
但是在dev-adc.c文件
.num_resources = ARRAY_SIZE(s3c_adc_resource),
.resource = s3c_adc_resource,
};
解决方法:
{
.name = "s3c24xx-adc",
.driver_data = TYPE_S3C24XX,
},{
.name = "s3c64xx-adc",
.driver_data = TYPE_S3C64XX,
},{
.name = "samsung-adc",
.driver_data = TYPE_S3C64XX,
},
{ }
};
测试方法2:移植tslib库:校准程序
2.1 tslib库的移植
1.拷贝tslib-1.4.tar.gz到ubutun的工作目录,如/home/jason/project
2.解压缩
tar -xvf tslib-1.4.tar.gz
3.配置
sudo apt-get install libtool
cd tslib
./autogen.sh
mkdir tmp
echo "ac_cv_func_mallo_0_nonnull=yes">arm-unknown-linux-gnueabi.cache
./configure --host=arm-unknown-linux-gnueabi --prefix=$(pwd)/tmp --cache-file=arm-unknown-linux-gnueabi.cache
4.编译(make)
ts_test.c:(.text+0x1e4): undefined reference to `rpl_malloc'
解决方法:将config.h.in里的 #undef malloc屏蔽掉
5.安装
make install
6.cd tmp
cp * /opt/rootfs
7.cd /opt/rootfs/lib
mkdir ts
8.cp tslib/plugins /opt/wlwfs/lib/ts
9.修改/opt/wlwfs/etc/ts.conf第一行(去掉#号和第一个空格)
#module_raw input
改为
module_raw input
10.修改etc/profile文件
vi etc/profile
在其中添加如下代码
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_PLUGINDIR=/lib/ts
export TSLIB_CONSOLEDEVICE=/dev/tty
export TSLIB_FBDEVICE=/dev/fb0 //lcd
记得执行:
source etc/profile
2.2 移植LCD驱动
vi linux-2.6.35.5/driver/video/Kconfig
tristate hardware windows whereas the S3C24XX series
currently only have two.
Currently the support is only for the S3C6400 and S3C6410 SoCs.
make menuconfig
编译内核:
make zImage
2.3 运行tslib库
selected device is not a touchscreen I understand
问题1:屏幕大小不对(480*272)
问题2:tslib库认为我们的设备不是触摸屏设备
解决问题1:
修改大小
vi arch/arm/mach_s5pc100/mach_smdkc100.c
.left_margin ,
.right_margin ,
.upper_margin ,
.lower_margin ,
.hsync_len ,
.vsync_len ,
.xres ,
.yres ,
},
.max_bpp ,
.default_bpp ,
};
解决问题2:
到tslib库里面,搜索selected device is not a touchscreen I understand看它怎么样认为才是一个触摸屏设备
plugins/input-raw.c:61: fprintf(stderr, "selected device is not a touchscreen I understand\n");
vi plugins/input-raw.c +61
fprintf(stderr, "selected device is not a touchscreen I understand\n");
}
由上面的代码可知,触摸屏应该还要产生压力事件
所以,我们应该修改触摸屏驱动,
vi driver/input/touchsrceen/s3c2410_ts.c
input_set_abs_params(ts.input, ABS_Y, , , , );
input_set_abs_params(ts.input, ABS_PRESSURE, , , , ); ); );
input_sync(ts.input);
...
...
}); );
input_sync(ts.input);
...
}
2.4 再次运行tslib库
ts_calibrate //需要分别点击5次
ts_test
@成鹏致远
(blogs:http://lcw.cnblogs.com)
(email:wwwlllll@126.com)
(qq:552158509)
【Linux高级驱动】触摸屏驱动的移植的更多相关文章
- ARM-Linux驱动-触摸屏驱动分析
出处:http://blog.csdn.net/geekcome/article/details/6580981 硬件平台:FL2440 内核版本:2.6.28 主机平台:Ubuntu 11.04 内 ...
- Linux/Android——usb触摸屏驱动 - usbtouchscreen (一)【转】
本文转载自:http://blog.csdn.net/jscese/article/details/41827495 最近需要往TV上装一个触摸屏设备,现在比较常见的就是使用usb接口的触摸框,适用于 ...
- Linux高级字符设备驱动
转载:http://www.linuxidc.com/Linux/2012-05/60469p4.htm 1.什么是Poll方法,功能是什么? 2.Select系统调用(功能) Select ...
- linux 高级字符设备驱动 ioctl操作介绍 例程分析实现【转】
转自:http://my.oschina.net/u/274829/blog/285014 1,ioctl介绍 ioctl控制设备读写数据以及关闭等. 用户空间函数原型:int ioctl(int f ...
- Linux高级字符设备驱动 poll方法(select多路监控原理与实现)
1.什么是Poll方法,功能是什么? 2.Select系统调用(功能) Select系统调用用于多路监控,当没有一个文件满足要求时,select将阻塞调用进程. int selec ...
- linux 触摸屏驱动
目录 linux 触摸屏驱动 输入子系统怎么写? 触摸屏事件 事件分类 事件设置 硬件配置 设计思路 完整程序 测试 ts_lib 使用 问题小结 title: linux 触摸屏驱动 tags: l ...
- 基于FT5x06嵌入式Linux电容触摸屏驱动
**************************************************************************************************** ...
- 基于设备树的TQ2440触摸屏驱动移植
平台 开发板:tq2440 内核:Linux-4.9 u-boot:u-boot-2015.04 概述 之前移植了LCD驱动,下面继续移植触摸屏驱动,然后将tslib也移植上去. 正文 一.移植触 ...
- Linux学习: 触摸屏驱动
一.Linux输入子系统的结构: 二.触摸屏驱动代码: s3c_ts.c #include <linux/errno.h> #include <linux/kernel.h> ...
随机推荐
- UVA 11624-Fire!【双BFS】
<题目链接> 题目大意: 你的任务是帮助J走出一个大火蔓延的迷宫.J每分钟可以超上下左右四个方向移动,而所有着火的格子每一分钟都会往四个方向蔓延一格.迷宫中有一些障碍,J和火都无法进入.当 ...
- 增强for 可以用于ArrayList
ArrayList<Integer> list=null; for(int i : list){ sum+=i; }
- TXT 与 DataTable 互转
//********************************************************************************************* publ ...
- [USACO4.2]Drainage Ditches
OJ题号:洛谷2740.POJ1273.HDU1532 思路:最大流模板. #include<queue> #include<cstdio> #include<cctyp ...
- C#线程篇---Task(任务)和线程池不得不说的秘密
我们要知道的是,QueueUserWorkItem这个技术存在许多限制.其中最大的问题是没有一个内建的机制让你知道操作在什么时候完成,也没有一个机制在操作完成是获得一个返回值,这些问题使得我们都不敢启 ...
- API判断本机安装的Revit版本信息
start [Transaction(TransactionMode.Manual)] [Regeneration(RegenerationOption.Manual)] public class c ...
- ConcurrentHashMap 的实现原理
概述 我们在之前的博文中了解到关于 HashMap 和 Hashtable 这两种集合.其中 HashMap 是非线程安全的,当我们只有一个线程在使用 HashMap 的时候,自然不会有问题,但如果涉 ...
- stm32型号解读
ST意法半导体在牵手ARM后可以说是做的非常成功,抓住了从普通MCU到ARM的市场转变的机会.由于ST公司的STM32系列ARM 使用了完善的库开发,作为芯片的应用者不用从底层的寄存器来实现每个功 ...
- How to make an IntelliJ IDEA plugin in less than 30 minutes
Sometimes it is a nice thing to extend an editor to have it do some new stuff, like being able to re ...
- vmware vSphere 5.5的14个新功能
摘录自:http://www.networkworld.com/slideshow/117304/12-terrific-new-updates-in-vmware-vsphere-55.html#s ...