linux 触摸屏驱动程序设计
LINUX设备驱动程序(4)

协议简介
对于网络的正式介绍一般都采用 OSI (Open Systems Interconnection)模型, 但是Linux 中网络栈的介绍一般分为四层的 Internet 模型。
协议栈层次对比
OSI七层网络模型 应用层 表示层 会话层 传输层 网络层
数据链路层 物理层
Linux TCP/IP 四层概念模型
网络协议
网络协议层用于实现各种具体的网络协议, 如: TCP、UDP 等。
设备无关接口
设备无关接口将协议与各种网络设备驱动连接在一起。 这一层提供一组通用函数供底层网络设备驱动程序使用,让 它们可以对高层协议栈进行操作。
首先,设备驱动程序可能会通过调用 register_netdevice 或 unregister_netdevice 在内核中 进行注册或注销。调用者首先填写 net_device 结构,然后 传递这个结构进行注册。内核调用它的 init 函数(如果定义 了这种函数),然后执行一组健全性检查,并将新设备添加 到设备列表中(内核中的活动设备链表)。
驱动程序
网络栈底部是负责 管理物理网络设备 的设备驱动程序。
第二节 网卡驱动程序设计
设备注册
设备描述:
每个网络接口都由一个 net_device结构来描述
注册: 网络接口驱动的注册方式与字符驱动不同之处在于 它没有主次设备号,并使用如下函数注册。
int register_netdev(struct net_device *dev)
Linux网络子系统架构
Linux协议架构
Linux 网络子系统的顶部是系统调用接口。它为用 户空间的应用程序提供了一种访问内核网络子系统 的方法。位于其下面的是一个协议无关层,它提供 了一种通用方法来使用传输层协议。然后是具体协 议的实现,在 Linux 中包括内嵌的协议 TCP、 UDP,当然还有 IP。然后是设备无关层,它提供了 协议与设备驱动通信的通用接口,最下面是设备驱 动程序。
基于Linux的触摸屏设备驱动的设计

触摸屏技术在我国的应用虽然只有 l O多年的
时间,但是它已经成了继键盘、鼠标、手写板、语音
输入后最为普通百姓所易接受的计 算柳输 入 . 方式。
本文 介 绍 了 以 2 T 内核 的 ¥ C 4 0 0 3 24 A
处 理 器 为 核 心 的 触 集成 了触摸屏控制器,它的
u sg e n h a al n in dit e dti; wat q e e h a t ; i u u_ ed wq
_ _
s i l k t o k pn o lc ;
_
换进行 x和 Y 位置转换,A 变换完成后 ,分别 D
) sd v t e; _ .
读取 x和 Y位置坐标,然后等待触摸笔抬起。当
像,并烧写到 S C 4 0 3 2 1A处理器 中测试该驱动程序。 关 键
, 1系统设计
词:S C 4 0 触摸屏 驱动程序 3 24A
2硬件设计 如图 l ,在使用触摸屏时,S C 4O 处理器 3 2 lA 的引脚 X 、X P M、Y P和 Y 可以直接和触摸屏 M 相连。A C和触摸屏共用一个 A 转换器,对八 D 路模拟输入信号进行 A D变换,通过设置 A C控 D
N D 、I T T ,IT A C表示 AD转换器 ITA C N C N D / 已经完成转换,IT T N C表示触摸笔被按下。
并将之转换为 1 位的二进制数据。 0
图 l 驱动设计线路图
3软件设计 31增添触摸屏平台设备 .
触 摸屏 设备作为一个 平台设备,需 要加入 到 lu i x内核中才能被使用。下面是触摸屏设备的定义 n
触摸 笔抬起 后 ,再次触 发触 摸屏 中 断,将 X 和 Y
触摸屏程序设计

5.实验原理
S3C2410A微控制器内嵌了一个 S3C2410A微控制器内嵌了一个ADC和触摸屏接口,只需要在微控 微控制器内嵌了一个ADC和触摸屏接口 和触摸屏接口, 制器外部外接少量器件,就可以与触摸屏相连,实现触摸功能。 制器外部外接少量器件,就可以与触摸屏相连,实现触摸功能。 Linux操作系统中 该控制器对应的字符型驱动源文件为: 操作系统中, 在Linux操作系统中,该控制器对应的字符型驱动源文件为: s3c2410-ts.c,将该驱动编译为模块后,生成驱动模块:s3c2410ts.ko。 s3c2410-ts.c,将该驱动编译为模块后,生成驱动模块:s3c2410ts.ko。 使用该驱动模块时,只须将该模块用insmod命令插入到内核中即可 命令插入到内核中即可。 使用该驱动模块时,只须将该模块用insmod命令插入到内核中即可。 该模块插入内核后,自动在Linux的 该模块插入内核后,自动在Linux的/dev/目录下创建节点 touchscreen。 touchscreen。 对触摸屏设备的操作除了打开设备、关闭设备操作以外, 对触摸屏设备的操作除了打开设备、关闭设备操作以外,一般 只有读操作。读操作读取触摸屏的触点座标值及动作信息, 只有读操作。读操作读取触摸屏的触点座标值及动作信息,读取结 果保存在一个结构体变量中,该结构体的定义如程序清单1所示。 果保存在一个结构体变量中,该结构体的定义如程序清单1所) 启动MagicARM2410实验箱上的Linux,进行NFS连接,进入触摸屏驱动所 启动MagicARM2410实验箱上的 实验箱上的Linux,进行NFS连接 连接, 在目录,先插入触摸屏驱动模块, 目录,运行应用程序, 在目录,先插入触摸屏驱动模块,然后进入touchscreen目录,运行应用程序, 查看运行结果。 查看运行结果。
文档:、linux-308内核I2C触摸屏移植

Linux3.0.8平台搭建移植文档——I2C触摸屏移植1.I2C子系统goodix电容屏采用I2C接口与处理器连接,我们要首先确保linux内核拥有对I2C子系统的支持,下面我们从子系统的配置和电容屏驱动两个方面进行移植修改1)配置I2C子系统支持#make menuconfigDevice Drivers ---><*> I2C support --->[*] Enable compatibility bits for old user-space (NEW)<*> I2C device interface< > I2C bus multiplexing support (NEW)[*] Autoselect pertinent helper modules (NEW)I2C Hardware Bus support --->进入I2C Hardware Bus support选项,选中以下内容:*** I2C system bus drivers (mostly embedded / system-on-chip) ***< > Synopsys DesignWare (NEW)<*> GPIO-based bitbanging I2C< > OpenCores I2C Controller (NEW)< > PCA9564/PCA9665 as platform device (NEW)<*> S3C2410 I2C Driver< > Simtec Generic I2C interface (NEW)...2.GOODIX电容屏移植1)添加goodix电容屏驱动将“goodix_touch.c”文件copy到drivers/input/touchscreen/目录下,并将"goodix_touch.h"、"goodix_queue.h"文件copy到include/linux/目录下,并修改Kconfig文件及Makefile文件支持触摸屏驱动的配置和编译#vi driver/input/touchscreen/Kconfig在config TOUCHSCREEN_TPS6507X选项的后面添加以下内容:config TOUCHSCREEN_GOODIXtristate "GOODIX based touchscreen"depends on I2ChelpIt is a android driver to support Gooidx's touchscreen whose nameis guitar on s5pv210 platform. The touchscreen can support multi-touch not more than two fingers.Say Y here to enable the driver for the touchscreen on theS5V SMDK board.If unsure, say N.To compile this driver as a module, choose M here:the module will be called goodix_touch.ko.#vi driver/input/touchscreen/Makefile在文件最后添加如下内容:obj-$(CONFIG_TOUCHSCREEN_GOODIX) += goodix_touch.o2)添加i2c_board_info资源(电容屏)#vi arch/arm/mach-s5pv210/mach-smdkv210.c在smdkv210_i2c_devs0结构体数组定义中添加以下内容:...{ I2C_BOARD_INFO("24c08", 0x50), }, /* Samsung S524AD0XD1 */ { I2C_BOARD_INFO("wm8580", 0x1b), },{I2C_BOARD_INFO("Goodix-TS", 0x55),.irq = IRQ_EINT(4),},...3)配置电容屏选项#make menuconfigDevice Drivers --->Input device support --->...[*] Touchscreens ---><*> GOODIX based touchscreen4)make将在arch/arm/boot/下生成编译好的可执行程序zImage下载到开发板即可,执行命令“cat /dev/input/event0”,然后用手触摸屏幕会在终端看到输出打印的乱码信息,表示移植成功,如果没有打印信息或没有“/dev/input/event0”这个设备说明移植失败。
史上最详细的触摸屏驱动分析

/*触摸屏驱动程序及分析*/#include <linux/errno.h>#include <linux/kernel.h>#include <linux/module.h>#include <linux/slab.h>#include <linux/input.h>#include <linux/init.h>#include <linux/serio.h>#include <linux/delay.h>#include <linux/platform_device.h>#include <linux/clk.h>#include <asm/io.h>#include <asm/irq.h>#include <plat/regs-adc.h>#include <mach/regs-gpio.h>/* For ts.dev.id.version */#define S3C2410TSVERSION 0x0101#define WAIT4INT(x) (((x)<<8) | \S3C2410_ADCTSC_YM_SEN | S3C2410_ADCTSC_YP_SEN | S3C2410_ADCTSC_XP_SEN | \S3C2410_ADCTSC_XY_PST(3))#define AUTOPST (S3C2410_ADCTSC_YM_SEN | S3C2410_ADCTSC_YP_SEN | S3C2410_ADCTSC_XP_SEN | \S3C2410_ADCTSC_AUTO_PST | S3C2410_ADCTSC_XY_PST(0))static char *s3c2410ts_name = "s3c2410 TouchScreen";static struct input_dev *dev;static long xp;static long yp;static int count;extern struct semaphore ADC_LOCK;static int OwnADC = 0;static void __iomem *base_addr;/*把GPG12~15 设置为保留模式*/static inline void s3c2410_ts_connect(void){s3c2410_gpio_cfgpin(S3C2410_GPG12, S3C2410_GPG12_XMON);s3c2410_gpio_cfgpin(S3C2410_GPG13, S3C2410_GPG13_nXPON);s3c2410_gpio_cfgpin(S3C2410_GPG14, S3C2410_GPG14_YMON);s3c2410_gpio_cfgpin(S3C2410_GPG15, S3C2410_GPG15_nYPON);}/*求坐标的平均值,报告坐标,当还是按下状态时,再次调用ADC转换,如果抬起则让触摸屏设置为等待中断模式*/static void touch_timer_fire(unsigned long data){unsigned long data0;unsigned long data1;int updown;/*用于读取ADCDA T数据*/data0 = ioread32(base_addr+S3C2410_ADCDA T0);data1 = ioread32(base_addr+S3C2410_ADCDA T1);/*判断是按下还是送开*/updown = (!(data0 & S3C2410_ADCDA T0_UPDOWN)) && (!(data1 & S3C2410_ADCDA T0_UPDOWN));/*如果按下*/if (updown) {if (count != 0) {/*转换四次后进行事件汇报*/long tmp;tmp = xp;xp = yp;yp = tmp;/* 求平均值*/xp >>= 2;yp >>= 2;/* 报告x、y的绝对坐标值*/input_report_abs(dev, ABS_X, xp);input_report_abs(dev, ABS_Y, yp);/* 报告按键事件,键值为1(代表触摸屏对应的按键被按下) */input_report_key(dev, BTN_TOUCH, 1);/* 报告触摸屏的状态,1表明触摸屏被按下*/input_report_abs(dev, ABS_PRESSURE, 1);/* 同步*/input_sync(dev);}xp = 0;yp = 0;count = 0;/*自动X/Y轴坐标转换模式的设置,自动地进行X轴和Y轴的转换操作,随后产生相应的INT_ADC中断通知转换完毕*/iowrite32(S3C2410_ADCTSC_PULL_UP_DISABLE | AUTOPST, base_addr+S3C2410_ADCTSC);/*如果还没有启动ADC或者ADC转换四次完毕后则启动ADC*/iowrite32(ioread32(base_addr+S3C2410_ADCCON) | S3C2410_ADCCON_ENABLE_START, base_addr+S3C2410_ADCCON);} else {count = 0;/* 如果触摸笔是弹起状态,则提出报告,并让触摸屏处于等待触摸的阶段*//* 报告按键事件,键值为0(代表触摸屏对应的按键被释放) */input_report_key(dev, BTN_TOUCH, 0);/* 报告触摸屏的状态,0表明触摸屏未被按下*/input_report_abs(dev, ABS_PRESSURE, 0);/*同步*/input_sync(dev);/* 设置触摸屏为等待中断模式,等待触摸笔按下*/iowrite32(WAIT4INT(0), base_addr+S3C2410_ADCTSC);if (OwnADC) {OwnADC = 0;up(&ADC_LOCK);}}}static struct timer_list touch_timer =TIMER_INITIALIZER(touch_timer_fire, 0, 0);/*当触摸按下时,产生INT_TC中断,会进入到stylus_updown中断处理函数当有中断产生时,会使OwnADC=1,然后读取数据,并判断是抬起还是按下,按下则调用touch_timer_fire()函数,抬起则释放锁,并使OwnADC=0*/static irqreturn_t stylus_updown(int irq, void *dev_id){unsigned long data0;unsigned long data1;int updown;/*注意在触摸屏驱动模块中,这个ADC_LOCK的作用是保证任何时候都只有一个驱动程序使用ADC的中断线,因为在mini2440的adc模块中也会使用到ADC,这样只有拥有了这个锁,才能进入到启动ADC代码部分,注意尽管LDD3中说过信号量因为休眠不适合使用在ISR中,但down_trylock是一个例外,它不会休眠*/if (down_trylock(&ADC_LOCK) == 0) {OwnADC = 1;//获取ADC转换的数据data0 = ioread32(base_addr+S3C2410_ADCDA T0);data1 = ioread32(base_addr+S3C2410_ADCDA T1);updown = (!(data0 & S3C2410_ADCDA T0_UPDOWN)) && (!(data1 & S3C2410_ADCDA T0_UPDOWN));/*判断目前触摸笔的状态updown = 1 触摸笔按下;updown = 0 触摸笔弹起;*/if (updown) {//当触摸笔按下时touch_timer_fire(0); /*这是一个定时器函数,当然在这里只是作为普通函数调用,用来启动ADC*/} else {//当笔弹起时,释放锁OwnADC = 0;up(&ADC_LOCK);}}return IRQ_HANDLED;}/*INT_ADC 中断处理函数读取四次AD转换的值,然后求和,超过四次后执行touch_time_fire()函数*/static irqreturn_t stylus_action(int irq, void *dev_id){unsigned long data0;unsigned long data1;if (OwnADC) {data0 = ioread32(base_addr+S3C2410_ADCDA T0);data1 = ioread32(base_addr+S3C2410_ADCDA T1);xp += data0 & S3C2410_ADCDA T0_XPDA TA_MASK;yp += data1 & S3C2410_ADCDA T1_YPDA TA_MASK;count++;if (count < (1<<2)) { /*如果小于四次重新启动ADC转换*/iowrite32(S3C2410_ADCTSC_PULL_UP_DISABLE | AUTOPST, base_addr+S3C2410_ADCTSC);iowrite32(ioread32(base_addr+S3C2410_ADCCON)|S3C2410_ADCCON_ENABLE_STAR T, base_addr+S3C2410_ADCCON);} else {/*如果超过四次,启动1个时间滴答的定时器,停止ADC,然后调用定时器处理函数touch_timer_fire进行数据上报*/mod_timer(&touch_timer, jiffies+1);iowrite32(WAIT4INT(1), base_addr+S3C2410_ADCTSC);}}return IRQ_HANDLED;}static struct clk *adc_clock;/*初始化主要做的工作为:1、获取ADC时钟并使时钟使能2、申请IO虚拟地址3、设置ADCCON,ADCDLY,ACDTSC4、申请input设备5、设置input事件类型,事件值,X,Y坐标的最大最小值6、中断申请7、注册input设备*/static int __init s3c2410ts_init(void){struct input_dev *input_dev; //定义input结构体指针/*获取时钟,触摸屏是挂载在APB BUS上的外围设备,需要时钟控制,见数据手册第7章*/adc_clock = clk_get(NULL, "adc");if (!adc_clock) {//如果时钟获取失败时printk(KERN_ERR "failed to get adc clock source\n");return -ENOENT;}//时钟使能clk_enable(adc_clock);/*I/O内存不要直接进行访问的,最好对其进行映射*/base_addr=ioremap(S3C2410_PA_ADC,0x20);if (base_addr == NULL) {printk(KERN_ERR "Failed to remap register block\n");return -ENOMEM;}/* Configure GPIOs 把YPON,YMON,XPON,XMOND都设置成11,保留模式*/s3c2410_ts_connect();/*使能预分频和设置分频系数S3C2410_ADCCON_PRSCEN:使AD转换使能,是ADCCON的第14位PRSCENS3C2410_ADCCON_PRSCVL(0xFF):预分频系数,取值为0~255:,AD时钟=PCLK/(PRSCVL+1),且必须小于1/5的PCKL*/iowrite32(S3C2410_ADCCON_PRSCEN | S3C2410_ADCCON_PRSCVL(0xFF),base_addr+S3C2410_ADCCON);/*设置ADC延时,在等待中断模式下表示产生INT_TC的间隔时间,ADC转换周期等待定时器*/iowrite32(0xffff, base_addr+S3C2410_ADCDLY);/*ADCTSC = 0xd3 ,将触摸屏置为等待中断模式,等待触摸屏被按下产生INT_TC中断*/iowrite32(WAIT4INT(0), base_addr+S3C2410_ADCTSC);/* 以下配置2.6内核划分出来的输入设备*//* 分配一个input输入设备*/input_dev = input_allocate_device();if (!input_dev) {//分配input输入设备不成功时printk(KERN_ERR "Unable to allocate the input device !!\n");return -ENOMEM;}dev = input_dev;/*evbit字段用来定义该输入设备可以支持的(产生和响应)的事件的类型,触摸屏设置为支持同步(EN_SYN)、按键(EN_KEY)、绝对坐标(EV_ABS)事件*/dev->evbit[0] = BIT(EV_SYN) | BIT(EV_KEY) | BIT(EV_ABS);/* 设置所支持的按键(键值),触摸屏可以看成只有一个按键的设备*/dev->keybit[BITS_TO_LONGS(BTN_TOUCH)] = BIT(BTN_TOUCH);/* 设置绝对坐标x的最小最大值(0-0x3FF) */input_set_abs_params(dev, ABS_X, 0, 0x3FF, 0, 0);/* 设置绝对坐标y的最小最大值(0-0x3FF) */input_set_abs_params(dev, ABS_Y, 0, 0x3FF, 0, 0);input_set_abs_params(dev, ABS_PRESSURE, 0, 1, 0, 0);dev->name = s3c2410ts_name;dev->id.bustype = BUS_RS232;dev->id.vendor = 0xDEAD;dev->id.product = 0xBEEF;dev->id.version = S3C2410TSVERSION;/*INT_TC, INT_ADC中断注册,问题:两种中断的产生时机?哪种中断会先产生?答案:INT_TC会先产生,并不断的产生*//* Get irqs *///中断处理函数if (request_irq(IRQ_ADC, stylus_action, IRQF_SHARED|IRQF_SAMPLE_RANDOM, "s3c2410_action", dev)) {printk(KERN_ERR "s3c2410_ts.c: Could not allocate ts IRQ_ADC !\n");iounmap(base_addr);return -EIO;}if (request_irq(IRQ_TC, stylus_updown, IRQF_SAMPLE_RANDOM,"s3c2410_action", dev)) {printk(KERN_ERR "s3c2410_ts.c: Could not allocate ts IRQ_TC !\n");iounmap(base_addr);return -EIO;}printk(KERN_INFO "%s successfully loaded\n", s3c2410ts_name);/* All went ok, so register to the input system *//*注册输入设备*/input_register_device(dev);return 0;}/*主要完成:1、中断的释放2、注销input设备3、释放虚拟内存*/static void __exit s3c2410ts_exit(void){disable_irq(IRQ_ADC);disable_irq(IRQ_TC);free_irq(IRQ_TC,dev);free_irq(IRQ_ADC,dev);if (adc_clock) {clk_disable(adc_clock);clk_put(adc_clock);adc_clock = NULL;}input_unregister_device(dev);iounmap(base_addr);}module_init(s3c2410ts_init);module_exit(s3c2410ts_exit);MODULE_LICENSE("GPL");。
linux 开发新驱动步骤

linux 开发新驱动步骤Linux作为一款开源的操作系统,其内核源码也是开放的,因此,许多开发人员在Linux上进行驱动开发。
本文将介绍在Linux上进行新驱动开发的步骤。
第一步:确定驱动类型和接口在进行驱动开发前,需要确定驱动类型和接口。
驱动类型包括字符设备驱动、块设备驱动、网络设备驱动等。
接口包括设备文件、系统调用、ioctl等。
根据驱动类型和接口的不同,驱动开发的流程也有所不同。
第二步:了解Linux内核结构和API驱动开发需要熟悉Linux内核的结构和API。
Linux内核由许多模块组成,每个模块都有自己的功能。
API是应用程序接口,提供了许多函数和数据结构,开发人员可以使用这些函数和数据结构完成驱动开发。
第三步:编写驱动代码在了解了Linux内核结构和API后,就可以编写驱动代码了。
驱动代码需要按照Linux内核的编码规范编写,确保代码风格统一、可读性好、可维护性强等。
在编写代码时,需要使用API提供的函数和数据结构完成相应的功能。
第四步:编译驱动代码和内核模块驱动代码编写完成后,需要编译成内核模块。
编译内核模块需要使用内核源码中的Makefile文件。
编译完成后,会生成一个.ko文件,这个文件就是内核模块。
第五步:加载和卸载内核模块内核模块编译完成后,需要加载到Linux系统中。
可以使用insmod命令加载内核模块,使用rmmod命令卸载内核模块。
在加载和卸载内核模块时,需要注意依赖关系,确保依赖的模块已经加载或卸载。
第六步:调试和测试驱动开发完成后,需要进行调试和测试。
可以使用printk函数输出调试信息,在/var/log/messages文件中查看。
测试时需要模拟各种可能的情况,确保驱动程序的稳定性和可靠性。
Linux驱动开发需要掌握Linux内核结构和API,熟悉驱动类型和接口,按照编码规范编写驱动代码,并进行编译、加载、调试和测试。
只有掌握了这些技能,才能进行高效、稳定和可靠的驱动开发。
精通Linux设备驱动程序开发-第7章-输入设备驱动

第7章 输入设备驱动内核的输入子系统是为了对分散的、多种不同类别的输入设备(如键盘、鼠标、跟踪球、操纵杆、辊轮、触摸屏、加速计和手写板)进行统一处理的驱动。
输入子系统带来了如下好处:•统一了物理形态各异的相似的输入设备的处理功能。
例如,各种鼠标,不论PS/2、USB,还是蓝牙,都被同样处理。
•提供了用于分发输入报告给用户应用程序的简单的事件(event)接口。
你的驱动不必创建、管理/dev节点以及相关的访问方法。
因此它能很方便的调用输入API以发送鼠标移动、键盘按键,或触摸事件给用户空间。
X Windows这样的应用程序能够无缝地运行于输入子系统提供的event接口之上。
•抽取出了输入驱动的通用部分,简化了驱动,并提供了一致性。
例如,输入子系统提供了一个底层驱动(成为serio)的集合,支持对串口和键盘控制器等硬件输入设备的访问。
图7.1展示了输入子系统的操作。
此子系统包括一前一后运行的两类驱动:事件驱动和设备驱动。
事件驱动负责和应用程序的接口,而设备驱动负责和底层输入设备的通信。
鼠标事件产生者mousedev,是前者的实例;而PS/2鼠标驱动是后者的实例。
事件驱动和设备驱动都可以利用输入子系统的高效、可重用的核心提供的服务。
图 7.1. 输入子系统事件驱动是标准的,对所有的输入类都是可用的,所以你更可能的是实现设备驱动而不是事件驱动。
你的设备驱动可以利用一个已经存在的、合适的事件驱动通过输入核心和用户应用程序接口。
需要注意的是本章使用的名辞“设备驱动”指的是输入设备驱动,而不是输入事件驱动。
输入事件驱动输入子系统提供的事件接口已经发展成为很多图形窗口系统理解的标准。
事件驱动提供一个硬件无关的抽象,以和输入设备交互;如同帧缓冲接口(在第12章《视频设备驱动》中讨论)提供一个通用的机制以和显示设备通信一样。
事件驱动和帧缓冲驱动一起,将图形用户接口(GUI)和各种各样的底层硬件隔离开来。
Evdev接口Evdev是一个通用的输入事件驱动。
嵌入式Linux中触摸屏驱动程序的设计

1 引盲 嵌入式Li n u x 是一种开放源码、软实
义的人口 点来进行。 通常, 字符设备驱动程序 能提供如下人口 点: 1为 价入口点。 , 打开设备准备1 0 操作。 / ) l e 2 c os 入口 点。关闭一个设备。 ) e 3 r ad 入口点。从设备上读数据。 ) i e 4 wr t 入口 点。往设备上写数据。 5) o U入口 执行读、写 ic 点。 之外的操作, 实现对设备的控制。 6冲le t 人口 检查设备, c 点。 看数据是否可 读或设备是否可用于写数据。 3. 2 设备的添加和删除 添加设备: 在Li n u x 系统中, 通过调用
T 技 术
SC〔r心 〔 & 下 0 日 工 OG Y 叭 日 I ON 〕 〔 峨 「0 MAT
嵌入式 L I nΒιβλιοθήκη UX中触摸屏驱动程序的设计
4, ) 0003
杨凤年 何文德 黄彩谁 (长沙学院计算机科学与技术系 湖南长沙
摘 要: 简要介绍了L n u x 设备驱动程序的概念、分类、基本工作原理和关键技术, i 以及嵌人式系统中常用的电阻式触摸屏的组成和 工作原理。给出了基于嵌人式L n u x 的触摸屏设备驱动程序的设计和实现方法。 i 关键词:嵌入式系统 L nux 驱动程序 触摸屏 i 中图分类号:T P 3l l . 52 文献标识码: A 文章编号: 1672一 1(20 7)0 (a)一 379 0 6 0135一 02 点处的电压, 从而知道接触点处的坐标。 对触摸屏的控制有专门的芯片, 本文采用 时、多任务的操作系统, 是开发嵌人式产品的 Bu 一 犷 r Bro, n公司生产的触摸屏专用接口 芯片 优秀软件平台, 是在标准Li u 基础上针对嵌 ADS7843。它有两个主要功能: 一、完成电 nx 极 入式系统进行裁减和优化后形成的, 因此它具 电压切换, 二、采集接触点处的电压值, 并进 和纵向导体层之 有Li u 的基本性质。在Li u 系 nx nx 统中, 设备 行A/ D 转换。对电压的横向 驱动程序对用户程序隐藏了 设备的具体细节, 间的切换以及A/ D 转换, 需要先由 微处理器 4 X 或普通1/ 0 口 把设备映射为一个特殊的设备文件, 用户程序 (S3C4 BO )通过510 串行接口 可以像对其他文件一样对设备文件进行操作。 向ADS7843 发送控制字, D 转换完成后, A/ 因此, 对设备文件的操作实质就是对设备的操 微处理器再通过5 0 串行接口 1 或普通1 0 口 / 作。 n u 中的设备可以分为三类:字符设备, 读出 A / D 转换值 。微处理器通过 中断 Li x 块设备和网络设备。其中, 字符设备没有缓冲 (EXINT2 与触摸屏交换数据, ) 触摸屏模块的 区, 以字节为单位顺序处理数据。常见的字符 硬件连接如图1所示。 其中 脚X + , + , 管 Y X 设备有普通打印机、系统的串口、 终端显示 一, 一 Y 与触摸屏连接, PFS、 PF6、 PF7、 S F P 器、 嵌入式设备中的简单按键、 触摸屏、 手写 和EXINTZ与微处理器的 相应管脚连接。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
物理与电子工程学院《嵌入式系统设计》课程小论文课题题目linux 触摸屏驱动程序设计系别物理与电子工程学院年级08级专业电子科学与技术学号050208110学生姓名储旭日期2011-12-21目录第 1 章嵌入式 linux 触摸屏驱动程序设计........................................................................ - 2 -1.1 课题设计的目的.......................................................................................................... - 2 -1.2 课题设计要求.............................................................................................................. - 2 - 第二章课题设计平台构建与流程............................................................................................ - 2 -2.1 嵌入式系统开发平台构建.......................................................................................... - 2 -2.1.1 cygwin 开发环境............................................................................................ - 2 -2.1.2 Linux 开发环境.............................................................................................. - 5 -2.1.3 Embest IDE 开发环境.................................................................................... - 5 -2.2 触摸屏设计流程.......................................................................................................... - 5 -2.3 课题设计硬件结构与工作原理.................................................................................. - 6 -2.3.1 硬件结构概述.................................................................................................. - 6 -2.3.2 触摸屏工作原理.............................................................................................. - 8 - 第三章 Bootloader 移植与下载.............................................................................................. - 9 -3.1 Vivi 源代码的安装.................................................................................................... - 9 -3.2 Vivi 源代码分析...................................................................................................... - 10 -3.3 Vivi 源代码的编译与下载...................................................................................... - 11 - 第四章 Linux 内核移植与下载.............................................................................................. - 12 -4.1 Linux 内核源代码的安装........................................................................................ - 12 -4.2 Linux 内核源代码分析与移植................................................................................ - 14 -4.3 Linux 内核编译与下载............................................................................................ - 14 - 第五章触摸屏功能模块程序设计与交叉编译...................................................................... - 16 -5.1 功能模块驱动程序设计............................................................................................ - 16 -5.2 触摸屏功能模块交叉编译........................................................................................ - 20 - 第六章根文件系统建立与文件系统下载.............................................................................. - 20 -6.1 Cramfs 根文件系统分析.......................................................................................... - 20 -6.2 文件系统映像文件生成............................................................................................ - 21 -6.3 功能模块运行与调试................................................................................................ - 22 - 第七章课题设计总结与体会.................................................................................................. - 26 - 参考文献:................................................................................................................................ - 27 -第 1 章嵌入式 linux 触摸屏驱动程序设计1.1 课题设计的目的在开发基于Linux 的嵌入式系统前需要首先建立嵌入式系统的开发环境,并制定嵌入式系统上的Linux 内核。
本课题设计的主要目的是:1)进一步了解嵌入式开发工具链的构造过程;2)掌握开发主机与嵌入式系统通信的方法;3)通过实际程序设计和调试,逐步掌握模块化程序设计方法和调试技术,提高阅读和修改程序的能力;4)通过完成一个嵌入式linux 系统开发的完整过程,使我们了解开发嵌入式linux 应用系统的全过程,为今后学习打下基础,积累实际操作的经验。
1.2 课题设计要求1)理解基于Linux 的嵌入式系统交叉开发环境,对嵌入式系统的开发流程有详细的了解;2)掌握开发工具链的构建方法,能独立进行系统开发操作;3)掌握Linux 的常用命令,在linux 系统下熟练的使用这些常用命令;4)熟悉linux 内核的知识以及原理,掌握定制Linux 内核的方法;5)基于Linux 操作系统,以及Emest III 实验箱,利用触摸屏返回触点坐标值及动作信。
坐标及动作的具体显示:触摸笔动作,触点X 坐标值,触点Y 坐标值。
第二章课题设计平台构建与流程2.1 嵌入式系统开发平台构建2.1.1 cygwin 开发环境1、运行Cygwin 安装程序setup.exe,然后选择“Install from Local Directory“,选择“下一步” ,2、选择Cygwin 的安装目录,注意Cygwin 的安装目录必须位于硬盘NTFS 分区(且尽量不要使用系统C 分区)否则会影响文件属性和权限操作,,可能导致错误的结果。
选择Unix 文本文件类型进行安装,直接选择“下一步” 则会把Unix 格式的cygwin 系统安装到NTFS 格后,NTFS Unix 式的D 分区中,且安装目录为D:\cygwin。
选择安装目录安装软件包存放目录。
3、选择Cygwin 安装包所在的目录,可以是光盘也可以是本地硬盘分区。
如E:/Cygwin。
选择“下一步”继续安装。
4、选择软件安装项目。
用鼠标单击在安装项目左边“ Default”字样的位置,可以调整该软件项目的安装设置,可能出现的状态有四种:Default --- 该项目根据默认状态处理,可能被安装,也可能不安装Install --- 安装该项目Reinstall --- 重新安装该项目Uninstall --- 移除该项目5、对于cygwin 的软件项目,如果完全安装可能需要1GB 以上空间,对于不想安装的项目可以选择状态为Default。