【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> ...
随机推荐
- 求链表的倒数第m个元素
法一: 首先遍历一遍单链表,求出整个单链表的长度n,然后将倒数第m个,转换为正数第n-m+1个,接下去遍历一次就可以得到结果. 不过这种方法需要对链表进行两次遍历,第一次遍历用于求解单链表的长度,第二 ...
- Ubuntu 开机自启动SSH+远程关机
Ubuntu 开机自启动SSH+远程关机 安装SSH 如何通过ssh远程登录linux系统 开机自启动ssh sudo gedit /etc/rc.locl # 输入密码 # 添加下面命令于 ex ...
- 001.Docker简介概述
一 简介 Docker最初是dotCloud公司的一个内部项目,诞生于 2013 年初,由google公司开源的Go语言开发. Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的.可移 ...
- IPv6升级改造包括什么?
关于IPv6技术升级具体做了什么,在我脑海里只是更换了域名解析的IP而已,所以找了这篇文章,帮助初步解惑. 原文地址:https://www.maczd.com/post/web-ipv6-upgra ...
- ARP和RARP协议详解
ARP概述 为什么要用ARP?即ARP的作用 (1) TCP/IP 的32bit的IP地址,仅知道主机的IP地址不能让内核发送数据帧给主机 (2) 网络接口的硬件地址,它是一个48bit的值,用来标识 ...
- ISO9000和CMM
ISO9000和CMM,谁更适合软件开发? ISO9000 和 CMM 是国际上通用的软件质量评估和管理方法.二者有很多相似之处,它们的实施都可以改变软件开发的不规范.文档不齐.维护跟不上.质量漏洞多 ...
- Python3自然语言(NLTK)——语言大数据
NLTK 这是一个处理文本的python库,我们知道文字性的知识可是拥有非常庞大的数据量,故而这属于大数据系列. 本文只是浅尝辄止,目前本人并未涉及这块知识,只是偶尔好奇,才写本文. 从NLTK中的b ...
- Linux运维笔记(一)网络基础知识
网络基础知识 一.基本概念 1.ARPANET & TCP/IP:以“软件”技术将网络硬件整合,使得不同的计算机或者数据可以通过这个软件达成数据沟通(TCP/IP技术也被称为Internet) ...
- 滑动CheckBox样式
<Style x:Key="SliderCheckBox" TargetType="{x:Type CheckBox}"> <Setter P ...
- PHP函数 ------ ctype_alnum
//判断是否是字母和数字或字母数字的组合 if(!ctype_alnum($str)){ echo '只能是字母或数字的组合';exit; }整理下ctype functions: 1.ctype_a ...