当前位置:文档之家› s3c2410按键驱动完整版

s3c2410按键驱动完整版

s3c2410按键驱动完整版
s3c2410按键驱动完整版

/* 2410 中断按键驱动

*基于s3c2410的16个按键驱动,采用中断的方式,实现了阻塞和非阻塞,并用定时*器进行了消抖处理消抖,也实现的异步通知,POLL机制,每个源文件我都加了比较*详细的注释。各位刚刚学习ARM/Linux *驱动的同学可以参考。

*/

// button_irq_driver .c 驱动源文件

// button_irq_test.c 应用程序---按键测试(open可实现阻塞和非阻塞)

// button_poll_test.c 应用程序---poll机制按键测试

// button_fasync.c 应用程序---异步通知方式按键测试

/* button_irq_driver .c */

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

static unsigned int buttons_major = 0;

//本地结构体,表示一个按键

struct fsbuttons_cdev{

struct cdev *buttons_cdev; //按键设备结构体

struct class *buttons_class;//所属类

unsigned int key_buttons; //按键管脚电?1 /0

wait_queue_head_t buttons_wq;

struct timer_list button_timer;

};

static struct fsbuttons_cdev *fs_buttons ;

//构建一个结构体,用来描述中断管脚

struct fspin{

int irq;

int pin;

char *name;

int num;

int row_input;

int row_output;

int int_put;

int key_val;

};

static struct fspin fspin_desc[4]={

{IRQ_EINT0, S3C2410_GPF0, "row0", 0,

S3C2410_GPF0_INP, S3C2410_GPF0_OUTP, S3C2410_GPF0_EINT0},

{IRQ_EINT2, S3C2410_GPF2, "row1", 1,

S3C2410_GPF2_INP, S3C2410_GPF2_OUTP, S3C2410_GPF2_EINT2},

{IRQ_EINT11, S3C2410_GPG3, "row2", 2,

S3C2410_GPG3_INP, S3C2410_GPG3_OUTP, S3C2410_GPG3_EINT11}, {IRQ_EINT19, S3C2410_GPG11, "row3", 3,

S3C2410_GPG11_INP, S3C2410_GPG11_OUTP,

S3C2410_GPG11_EINT19},

};

struct pin_col {

int pin;

int col_input;

int col_output;

};

static struct pin_col col_line[4] = {

{S3C2410_GPE11, S3C2410_GPE11_INP, S3C2410_GPE11_OUTP}, {S3C2410_GPG6, S3C2410_GPG6_INP, S3C2410_GPG6_OUTP},

{S3C2410_GPE13, S3C2410_GPE13_INP, S3C2410_GPE13_OUTP}, {S3C2410_GPG2, S3C2410_GPG2_INP, S3C2410_GPG2_OUTP}, };

static int key_comfirm[4][4]={

{10,11,12,16},

{7,8,9,15},

{4,5,6,14},

{1,2,3,13},

};

/*构建异步通知注册函数用到的结构体*/

struct fasync_struct *fsbuttons_fasync;

struct fspin *cur_pin;

static void set_col_output(void)

{

int i;

for(i = 0;i<4;i++){

s3c2410_gpio_cfgpin(col_line[i].pin, col_line[i].col_output);

s3c2410_gpio_setpin(col_line[i].pin,0);

}

}

static void set_col_input(void)

{

int i;

for(i = 0;i<4;i++){

s3c2410_gpio_cfgpin(col_line[i].pin, col_line[i].col_input);

s3c2410_gpio_pullup(col_line[i].pin, 0);//上拉

}

}

//void (*function)(unsigned long);

static irqreturn_t button_timer_fun(unsigned long data)

{

int i;

unsigned int val_sec;

int row;

int col =-1;

if(!cur_pin)

return IRQ_NONE;

val_sec = s3c2410_gpio_getpin(cur_pin->pin);

if(val_sec != cur_pin->key_val)

return IRQ_NONE;

row = cur_pin->num;

/*将发生中断的引脚配置为输出低电平*/

s3c2410_gpio_cfgpin(cur_pin->pin, cur_pin->row_output); s3c2410_gpio_setpin(cur_pin->pin, 0);

/*将kscan0-kscan3设为输入并拉高*/

set_col_input();

/* 轮询列线,看哪个管脚为0,为0的那列保存起来*/

for(i = 0;i<4;i++){

if(s3c2410_gpio_getpin(col_line[i].pin) == 0)

col = i;

}

/*根据列线与行线保存键值*/

fs_buttons->key_buttons= key_comfirm[row][col];

/*恢复*/

/*将列线恢复为输出,并且输出为0*/

set_col_output();

/*将产生中断的管脚,再次恢复为中断功能*/

s3c2410_gpio_cfgpin(cur_pin->pin,cur_pin->int_put);

/*唤醒休眠的进程*/

wake_up_interruptible(&(fs_buttons->buttons_wq));

/*异步通知,发信号*/

kill_fasync(&fsbuttons_fasync, SIGIO, POLLIN);

return IRQ_HANDLED;

}

//typedef int irqreturn_t;

//#define IRQ_NONE (0) //处理失败//#define IRQ_HANDLED (1) //处理成功//#define IRQ_RETVAL(x) ((x) != 0) //无效的

static irqreturn_t buttons_irq_handler_fun(int irq, void *dev_id) {

cur_pin = (struct fspin *)dev_id;

/*获取管脚状态*/

cur_pin->key_val= s3c2410_gpio_getpin(cur_pin->pin);

/*有键按键按下*/

if(cur_pin->key_val== 0)

/*重载定时器*/

mod_timer(&fs_buttons->button_timer, jiffies +5);

return IRQ_HANDLED ;

}

static int buttons_open(struct inode *inode, struct file *file) {

int i ;

int ret = -1;

/*初始化设备*/

/*设置 kscan0 引脚为输出。输出为0*/

set_col_output();

/*注册中断 ,下降沿触发,中断名,中断id*/

for(i =0 ;i<4;i++)

ret = request_irq(fspin_desc[i].irq, buttons_irq_handler_fun, IRQF_TRIGGER_FALLING, fspin_desc[i].name, &fspin_desc[i]);

/*初始化定时器*/

init_timer(&fs_buttons->button_timer);

fs_buttons->button_timer.expires = jiffies +5;

fs_buttons->button_timer.function =(void *)button_timer_fun;

/*加载定时器*/

add_timer(&fs_buttons->button_timer);

/*初始化等待队列头*/

init_waitqueue_head(&fs_buttons->buttons_wq);

return 0;

}

static ssize_t buttons_read(struct file *filp, char __user *buf, size_t count, loff_t *opps)

{

int ret;

/*1.如果没有按键,而且应用程序是以非阻塞方式打开,就直接返回*/

if((fs_buttons->key_buttons == 0) && (filp->f_flags & O_NONBLOCK)) return 0;

/*1.如果没有键值key_buttons = 0 ,则休眠*/

wait_event_interruptible(fs_buttons->buttons_wq,fs_buttons->key_buttons);

/*2.如果有键值,将键值返回用户空间*/

/*如果拷贝成功则返回0,否则返回剩下的没有拷贝完的字节数*/

ret = copy_to_user(buf, &fs_buttons->key_buttons, count);

fs_buttons->key_buttons = 0; //键值清0

return 1;

}

static ssize_t buttons_write(struct file *file, const char __user *buf, size_t count, loff_t *opps)

{

return 0;

}

/*异步通知*/

int buttons_fasync(int fd, struct file *file , int on)

{

int error = 0;

/*想办法将file中的某些参数拿出来,实际上就是在设置fsbuttons_fasync结构体*/

error = fasync_helper(fd, file, on, &fsbuttons_fasync);

return error;

}

static unsigned int buttons_poll(struct file * file, struct poll_table_struct *wait)

{

int mask = 0;

/*1.将进程挂入等待队列,但是并不休眠*/

poll_wait(file, &(fs_buttons->buttons_wq), wait);

/*2.查看是否有事件*/

if(fs_buttons->key_buttons)

mask |= POLLIN;

return mask;

}

int buttons_close(struct inode *inode, struct file *file) {

int i;

for(i = 0;i<4;i++)

free_irq(fspin_desc[i].irq, &fspin_desc[i]);

return 0;

}

struct file_operations buttons_fops={

.owner =THIS_MODULE,

.open =buttons_open,

.read =buttons_read,

.write =buttons_write,

.poll =buttons_poll,

.release =buttons_close,

.fasync =buttons_fasync,

};

/*构建和初始化fsbuttons_cdev结构体*/

static void setup_fsbuttons_cdev(void)

{

/*给cdev

结构体分配空间*/

fs_buttons->buttons_cdev = cdev_alloc();

/*初始化*/

cdev_init(fs_buttons->buttons_cdev, &buttons_fops);

/*加载cdev*/

cdev_add(fs_buttons->buttons_cdev, MKDEV(buttons_major,0), 1); }

static int __init buttons_init(void)

{

int devno;

/*申请设备号,注册*/

if(buttons_major){

/*静态方式*/

devno = MKDEV(buttons_major,0);

register_chrdev_region(devno, 1, "buttons_driver");

}else{

/*动态方式*/

alloc_chrdev_region(&devno, 0, 1, "buttons_driver");

buttons_major = MAJOR(devno);

}

/*2.分配空间,

*GFP_KERNEL:如果分配空间不成功,则会休眠

*/

fs_buttons =kmalloc(sizeof(fs_buttons), GFP_KERNEL);

/*构建cdev*/

setup_fsbuttons_cdev();

/*创建设备文件*/

fs_buttons->buttons_class = class_create(THIS_MODULE,"buttons");

class_device_create(fs_buttons->buttons_class, NULL,

MKDEV(buttons_major,0), NULL, "buttons");

return 0;

}

static void __exit buttons_exit(void)

{

unregister_chrdev_region(MKDEV(buttons_major,0), 1);

kfree(fs_buttons);

cdev_del(fs_buttons->buttons_cdev);

class_device_destroy(fs_buttons->buttons_class, MKDEV(buttons_major,0));

class_destroy(fs_buttons->buttons_class);

}

module_init(buttons_init);

module_exit(buttons_exit);

MODULE_LICENSE("GPL");

/* button_irq_test.c */

#include

#include

#include

#include

#include

int main(void)

{

int fd = -1;

int val = -1;

int ret = -1;

// fd = open("/dev/buttons",O_RDWR|O_NONBLOCK);

fd = open("/dev/buttons",O_RDWR);

if(fd < 0){

perror("open");

exit(-1);

}

while(1){

ret = read(fd,&val,4);

if(ret < 0){

perror("read");

exit(-1);

}

printf("val = %d\n",val);

}

return 0;

}

/* button_poll_test.c */

#include

#include

#include

#include

#include

#include

int main(void)

{

int fd = -1;

int val = -1;

int ret = -1;

struct pollfd poll_fd[1];

// fd = open("/dev/buttons",O_RDWR|O_NONBLOCK);

fd = open("/dev/buttons",O_RDWR);

if(fd < 0){

perror("open");

exit(-1);

}

poll_fd[0].fd = fd;

poll_fd[0].events = POLLIN;

while(1){

ret =poll(poll_fd,1,5000);

if(ret>0)

{

read(poll_fd[0].fd,&val,4);

printf("val =%d\n",val);

}

else if(ret ==0)

{

printf("timeout!\n");

}

else

{

printf("error!\n");

}

}

return 0;

}

/* button_fasync.c */

#include

#include

#include

#include

#include

#include

#include

#include

#include

int fd;

/*1.实现信号处理函数*/

void signal_function(int signum)

{

unsigned int val;

static int cnt = 0;

printf("get singal %d, cnt = %d\n", signum, cnt++);

read(fd,&val,4);

printf("val =%d\n",val);

}

int main(int argc, char**argv)

{

int flags;

fd =open("/dev/buttons",O_RDWR);

if(fd<0)

{

printf("cannot open /dev/buttons!\n");

return -1;

}

/*2.将信号与信号处理函数绑定*/

signal(SIGIO, signal_function);

/*3.设置信号的拥有者为本进程*/

fcntl(fd,F_SETOWN,getpid()); //filp->f_owner.pid = get_pid(pid);

/*4.设置为异步通知的模式*/

flags |=FASYNC;

fcntl(fd,F_SETFL,flags); //调用到驱动中的fasync功能函数

while(1)

{

/*做自己的事情*/

sleep(3);

}

return 0;

}

USB键盘驱动程序

/* * $Id: usbkbd.c,v 1.27 2001/12/27 10:37:41 vojtech Exp $ * * Copyright (c) 1999-2001 Vojtech Pavlik * * USB HIDBP Keyboard support */ /* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Should you need to contact me, the author, you can do so either by * e-mail - mail your message to <>, or by paper mail: * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic */ #include #include #include #include #include #include #include /* * Version Information */ #define DRIVER_VERSION "" #define DRIVER_AUTHOR "Vojtech Pavlik <>" #define DRIVER_DESC "USB HID Boot Protocol keyboard driver" #define DRIVER_LICENSE "GPL"

显示和键盘流程图及程序

3.2 部分软件设计 3.2.3显示子程序 动态显示程序框图如图所示。显示程序的要点有两个:一是代码转换。因为直接驱动LED 显示器的是字形码,而人们习惯的是0、1、2、…、F 等字符,因此,必须将待显示的字符转换成字形码。转换用查表的方法进行。二是通过软件实现逐位轮流点亮每个LED 。 为了实现代码转换,首先开辟一个显示缓冲区,将待显示的字符预先存放在缓冲区中。由于有4位LED 显示器,故不妨假设显示缓冲区长度为4个字节。显示缓冲区地址为DIS 0~DIS 3 ,DIS 0单元与最左边一位LED 相对应,DIS 3单元与最右边一位LED 相对应。 程序清单如下: DIS : ORG 0500H MOV A ,#00000011B MOV DPTR ,#7F00H MOVX @DPTR ,A MOV R0,#78H MOV R3,#7FH MOV A ,R3 LD : MOV DPTR ,#7F01H 开 始 结 束 8051初始化 指向下个显示缓冲单元 显示下一位 延时1mS 段选码送入 查段选表 送位选字 动态显示初始化 3位显示完?

有键闭合吗? 确有键闭合吗 闭合键释放吗 返 回 MOVX @DPTR ,A INC DPTR MOV A ,@R0 ADD A ,#0DH MOVC A ,@ DPTR ACALL DLY MOV A ,R3 JNB A ,R0 RR A ,LD1 MOV R3,A INC R0 AJMP LD0 LD1: SJMP LD1 DSEG :DB 3FH ,06H ,5BH ,4FH ,66H ,6DH 7DH ,07H ,7FH ,6FH DLY : MOV R7,#02H DL : MOV R6,#0FFH DL1: DJNZ R6,DL1 DJNZ R7,DL RET 3.2.4键盘子程序 键盘扫描子程序框图如图 图3-4 键盘扫描子程序框图 开 始 两次调用 延时子程序 判断闭合键号 键号 → A 调用延时子程序

触摸屏驱动

二、前提知识 1、Linux输入子系统(Input Subsystem): 在Linux中,输入子系统是由输入子系统设备驱动层、输入子系统核心层(Input Core)和输入子系统事件处理层(Event Handler)组成。其中设备驱动层提供对硬件各寄存器的读写访问和将底层硬件对用户输入访问的响应转换为标准的输入事件,再通过核心层提交给事件处理层;而核心层对下提供了设备驱动层的编程接口,对上又提供了事件处理层的编程接口;而事件处理层就为我们用户空间的应用程序提供了统一访问设备的接口和驱动层提交来的事件处理。所以这使得我们输入设备的驱动部分不在用关心对设备文件的操作,而是要关心对各硬件寄存器的操作和提交的输入事件。下面用图形来描述一下这三者的关系吧! 另外,又找了另一幅图来说明Linux输入子系统的结构,可能更加形象容易理解。如下:

2、输入子系统设备驱动层实现原理: 在Linux中,Input设备用input_dev结构体描述,定义在input.h中。设备的驱动只需按照如下步骤就可实现了。 ①、在驱动模块加载函数中设置Input设备支持input子系统的哪些事件; ②、将Input设备注册到input子系统中; ③、在Input设备发生输入操作时(如:键盘被按下/抬起、触摸屏被触摸/抬起/移动、鼠标被移动/单击/抬起时等),提交所发生的事件及对应的键值/坐标等状态。 Linux中输入设备的事件类型有(这里只列出了常用的一些,更多请看linux/input.h中):

三、触摸屏驱动的实现步骤 1、硬件原理图分析: S3c2440芯片内部触摸屏接口与ADC接口是集成在一起的,硬件结构原理图请看: S3C2440上ADC驱动实例开发讲解中的图,其中通道7(XP或AIN7)作为触摸屏接口的X坐标输入,通道5(YP或AIN5)作为触摸屏接口的Y坐标输入。在"S3C2440上ADC驱动实例开发讲解"中,AD转换的模拟信号是由开发板上的一个电位器产生并通过通道1(AIN0)输入的,而这里的模拟信号则是由点触触摸屏所产生的X坐标和Y坐标两个模拟信号,并分别通过通道7和通道5输入。S3c2440提供的触摸屏接口有4种处理模式,分别是:正常转换模式、单独的X/Y位置转换模式、自动X/Y位置转换模式和等待中断模式,对于在每种模式下工作的要求,请详细查看数据手册的描述。本驱动实例将采用自动X/Y位置转换模式和等待中断模式。 注意:在每步中,为了让代码逻辑更加有条理和容易理解,就没有考虑代码的顺序,比如函数要先定义后调用。如果要编译此代码,请严格按照C语言的规范来调整代码的顺序。 2、建立触摸屏驱动程序my2440_ts.c,首先实现加载和卸载部分,在驱动加载部分,我们主要做的事情是:启用ADC所需要的时钟、映射IO口、初始化寄存器、申请中断、初始化输入设备、将输入设备注册到输入子系统。代码如下:

什么是驱动程序资料

什么是驱动程序? 驱动程序扮演沟通的角色,把硬件的功能告诉电脑系统,并且也将系统的指令传达给硬件,让它开始工作。 年轻人最大的动力,或者最大的优势就在于,你一旦想做什么你就马上去做。说这是天真也好,甚至对一些事情的无知也好,有这种勇气和决心就应该去做。” 什么是BSP? BSP是板级支持包,是介于主板硬件和操作系统之间的一层,应该说是属于操作系统的一部分,主要目的是为了支持操作系统,使之能够更好的运行于硬件主板。BSP是相对于操作系统而言的,不同的操作系统对应于不同定义形式的BSP,例如VxWorks的BSP和Linu x的BSP相对于某一CPU来说尽管实现的功能一样,可是写法和接口定义是完全不同的,所以写BSP一定要按照该系统BSP的定义形式来写(BSP的编程过程大多数是在某一个成型的BSP模板上进行修改),这样才能与上层OS保持正确的接口,良好的支持上层OS。 例如:在VxWorks中的网卡驱动,首先在config.h中包含该网卡,然后将网卡含网卡信息的参数放入数组END_TBL_ENTRY endDevTbl [ ] 中,系统通过函数muxDevLoad ( )调用这个数组来安装网卡驱动。而在Linux中的网卡驱动,是在space.c中声明该网络设备,再把网卡驱动的一些函数加到dev结构中,由函数ether_setup()来完成网卡驱动的安装。 纯粹的BSP所包含的内容一般说来是和系统有关的驱动和程序,如网络驱动和系统中网络协议有关,串口驱动和系统下载调试有关等等。离开这些驱动系统就不能正常工作。 用户也可以添加自己的程序到BSP中,但严格来说不应该算BSP.一般来说这种做法不建议。因为一旦操作系统能良好运行于最终的主板硬件后,BSP也就固定了,不需要做任何改动。而用户自己在BSP中的程序还会不断的升级更新,这样势必对BSP有不好的影响,对系统造成影响,同时由于BSP调试编译环境较差,也不利于程序的编译调试。 如何编写Linux设备驱动程序 Linux是Unix操作系统的一种变种,在Linux下编写驱动程序的原理和思想完全类似于其他的Unix系统,但它和dos或window环境下的驱动程序有很大的区别。在Linux环境下设计驱动程序,思想简洁,操作方便,功能也很强大,但是支持函数少,只能依赖kerne l中的函数,有些常用的操作要自己来编写,而且调试也不方便。 一、Linux device driver 的概念

字符设备驱动程序

字符设备驱动程序 字符设备驱动程序与块设备不同。所涉及的键盘驱动、控制台显示驱动和串口驱动以及与这些驱动有关的接口、算法程序都紧密相关。他们共同协作实现控制台终端和串口终端功能。 下图反映了控制台键盘中断处理过程。 以上为总的处理流程,下面对每一个驱动分开分析。首先是键盘驱动。键盘驱动用汇编写的,比较难理解,牵涉内容较多,有键盘控制器804X的编程,还有扫描码(共3套,这里用第二套)和控制命令及控制序列(p209~210有讲解)。由于键盘从XT发展到AT到现在PS/2,USB,无线键盘,发展较快,驱动各有不同,此版本驱动为兼容XT,将扫描码映射为XT再处理,因此仅供参考。CNIX操作系统的键盘驱动实现为C语言,可读性更好。 键盘驱动 键盘驱动就是上图键盘硬件中断的过程。keyboard.S中的_keyboard_interrupt 函数为中断主流程,文件中其他函数均被其调用。

以上打星处为键盘驱动的核心,即主要处理过程,针对不同扫描码分别处理,并最终将转换后所得ASCII 码或控制序列放入控制台tty 结构的读缓冲队列read_q 中。 键处理程序跳转表为key_table ,根据扫描码调用不同处理程序,对于“普通键”,即只有一个字符返回且没有含义变化的键,调用do_self 函数。其他均为“特殊键”:1. crtrl 键的按下和释放 2. alt 键的按下和释放 3. shift 键的按下和释放 4. caps lock 键的按下和释放(释放直接返回,不作任何处理) 5. scroll lock 键的按下 6. num lock 的按下 7. 数字键盘的处理(包括alt-ctrl+delete 的处理,因为老式键盘delete 键在数字小键盘上。还包括对光标移动键的分别处理) 8. 功能键 (F1~F12)的处理 9. 减号的处理(老键盘’/’与’-’以0xe0加以区分,可能其中一键要按shift ) do_self 是最常用的流程,即跳转表中使用频率最高的流程:

各类型触摸屏故障及维修方法

?关键词:触摸屏故障触摸屏 ?摘要:触摸屏是经常使用的电子产品,难免会出现问题,相信很多人在使用触摸屏时,都遇到触摸屏因出现故障而不能使用的情况。那么触摸 屏这些常见的故障该如何维修呢?本文就按触摸屏类型介绍一些常见故障的解决与维护方法: 触摸屏是经常使用的电子产品,难免会出现问题,相信很多人在使用触摸屏时,都遇到触摸屏因出现故障而不能使用的情况。那么触摸屏这些常见的故障该如何维修呢?本文就按触摸屏类型介绍一些常见故障的解决与维护方法: 一、表面声波触摸屏 ⑴故障一:触摸偏差 现象1:手指所触摸的位置与鼠标箭头没有重合。 原因1:安装完驱动程序后,在进行校正位置时,没有垂直触摸靶心正中位置。 解决1:重新校正位置。 现象2:部分区域触摸准确,部分区域触摸有偏差。 原因2:表面声波触摸屏四周边上的声波反射条纹上面积累了大量的尘土或水垢,影响了声波信号的传递所造成的。 解决2:清洁触摸屏,特别注意要将触摸屏四边的声波反射条纹清洁干净,清洁时应将触摸屏控制卡的电源断开。 ⑵故障二:触摸无反应 现象:触摸屏幕时鼠标箭头无任何动作,没有发生位置改变。 原因:造成此现象产生的原因很多,下面逐个说明: ①表面声波触摸屏四周边上的声波反射条纹上面所积累的尘土或水垢非常严重,导致触摸屏无法工作; ②触摸屏发生故障; ③触摸屏控制卡发生故障; ④触摸屏信号线发生故障; ⑤计算机主机的串口发生故障;

⑥计算机的操作系统发生故障; ⑦触摸屏驱动程序安装错误。 解决方法: ①观察触摸屏信号指示灯,该灯在正常情况下为有规律的闪烁,大约为每秒钟闪烁一次,当触摸屏幕时,信号灯为常亮,停止触摸后,信号灯恢复闪烁。 ②如果信号灯在没有触摸时,仍然处于常亮状态,首先检查触摸屏是否需要清洁;其次检查硬件所连接的串口号与软件所设置的串口号是否相符,以及计算机主机的串口是否正常工作。 ③运行驱动盘中的COMDUMP命令,该命令为DOS下命令,运行时在COMDUMP后面加上空格及串口的代号1或2,并触摸屏幕,看是否有数据滚出。有数据滚出则硬件连接正常,请检查软件的设置是否正确,是否与其他硬件设备发生冲突。如没有数据滚出则硬件出现故障,具体故障点待定。 ④运行驱动盘中的SAWDUMP命令,该命令为DOS下命令,运行程序时,该程序将寻问控制卡的类型、连接的端口号、传输速率,然后程序将从控制卡中读取相关数据。请注意查看屏幕左下角的X轴的AGC和Y轴的AGC 数值,任一轴的数值为255时,则该轴的换能器出现故障,需进行维修。 ⑤安装完驱动程序后进行第一次校正时,注意观察系统报错的详细内容。“没有找到控制卡”、“触摸屏没有连接”等,根据提示检查相应的部件。如:触摸屏信号线是否与控制卡连接牢固,键盘取电线是否全部与主机连接等。 ⑥如仍无法排除,请专业人员维修。 二、五线电阻触摸屏 ⑴故障一:触摸偏差 现象1:手指所触摸的位置与鼠标箭头没有重合。 原因1:①安装完驱动程序后,在进行校正位置时,没有垂直触摸靶心正中位置; ②触摸屏上的信号线接触不良或断路。 解决1:重新校正位置;查找断点,重新连接,或更换触摸屏。 现象2:不触摸时,鼠标箭头始终停留在某一位置;触摸时,鼠标箭头在触摸点与原停留点的中点处。

设备驱动程序

驱动程序 驱动程序一般指的是设备驱动程序(Device Driver),是一种可以使计算机和设备通信的特殊程序。相当于硬件的接口,操作系统只有通过这个接口,才能控制硬件设备的工作,假如某设备的驱动程序未能正确安装,便不能正常工作。 因此,驱动程序被比作“硬件的灵魂”、“硬件的主宰”、和“硬件和系统之间的桥梁”等。 中文名 驱动程序 外文名 Device Driver 全称 设备驱动程序 性质 可使计算机和设备通信的特殊程序 目录 1定义 2作用 3界定 ?正式版 ?认证版 ?第三方 ?修改版 ?测试版 4驱动程序的开发 ?微软平台 ?Unix平台 5安装顺序 6inf文件 1定义 驱动程序(Device Driver)全称为“设备驱动程序”,是一种可以使计算机和设备通信的特殊程序,可以说相当于硬件的接口,操作系统只能通过这个接口,才能控制硬件设备的工作,假如某设备的驱动程序未能正确安装,便不能正常工作。 惠普显卡驱动安装 正因为这个原因,驱动程序在系统中的所占的地位十分重要,一般当操作系统安装完毕后,首要的便是安装硬件设备的驱动程序。不过,大多数情况下,我们并不需要安装所有硬件设备的驱动程序,例如硬盘、显示器、光驱等就不需要安装驱动程序,而显卡、声卡、扫描仪、摄像头、Modem等就需要安装驱动程序。另外,不同版本的操作系统对硬件设

备的支持也是不同的,一般情况下版本越高所支持的硬件设备也越多,例如笔者使用了Windows XP,装好系统后一个驱动程序也不用安装。 设备驱动程序用来将硬件本身的功能告诉操作系统,完成硬件设备电子信号与操作系统及软件的高级编程语言之间的互相翻译。当操作系统需要使用某个硬件时,比如:让声卡播放音乐,它会先发送相应指令到声卡驱动程序,声卡驱动程序接收到后,马上将其翻译成声卡才能听懂的电子信号命令,从而让声卡播放音乐。 所以简单的说,驱动程序提供了硬件到操作系统的一个接口以及协调二者之间的关系,而因为驱动程序有如此重要的作用,所以人们都称“驱动程序是硬件的灵魂”、“硬件的主宰”,同时驱动程序也被形象的称为“硬件和系统之间的桥梁”。 戴尔电脑驱动盘 驱动程序即添加到操作系统中的一小块代码,其中包含有关硬件设备的信息。有了此信息,计算机就可以与设备进行通信。驱动程序是硬件厂商根据操作系统编写的配置文件,可以说没有驱动程序,计算机中的硬件就无法工作。操作系统不同,硬件的驱动程序也不同,各个硬件厂商为了保证硬件的兼容性及增强硬件的功能会不断地升级驱动程序。如:Nvidia显卡芯片公司平均每个月会升级显卡驱动程序2-3次。驱动程序是硬件的一部分,当你安装新硬件时,驱动程序是一项不可或缺的重要元件。凡是安装一个原本不属于你电脑中的硬件设备时,系统就会要求你安装驱动程序,将新的硬件与电脑系统连接起来。驱动程序扮演沟通的角色,把硬件的功能告诉电脑系统,并且也将系统的指令传达给硬件,让它开始工作。 当你在安装新硬件时总会被要求放入“这种硬件的驱动程序”,很多人这时就开始头痛。不是找不到驱动程序的盘片,就是找不到文件的位置,或是根本不知道什么是驱动程序。比如安装打印机这类的硬件外设,并不是把连接线接上就算完成,如果你这时候开始使用,系统会告诉你,找不到驱动程序。怎么办呢参照说明书也未必就能顺利安装。其实在安装方面还是有一定的惯例与通则可寻的,这些都可以帮你做到无障碍安装。 在Windows系统中,需要安装主板、光驱、显卡、声卡等一套完整的驱动程序。如果你需要外接别的硬件设备,则还要安装相应的驱动程序,如:外接游戏硬件要安装手柄、方向盘、摇杆、跳舞毯等的驱动程序,外接打印机要安装打印机驱动程序,上网或接入局域网要安装网卡、Modem甚至ISDN、ADSL的驱动程序。说了这么多的驱动程序,你是否有一点头痛了。下面就介绍Windows系统中各种的不同硬件设备的驱动程序,希望能让你拨云见日。 在Windows 9x下,驱动程序按照其提供的硬件支持可以分为:声卡驱动程序、显卡驱动程序、鼠标驱动程序、主板驱动程序、网络设备驱动程序、打印机驱动程序、扫描仪驱动程序等等。为什么没有CPU、内存驱动程序呢因为CPU和内存无需驱动程序便可使用,不仅如此,绝大多数键盘、鼠标、硬盘、软驱、显示器和主板上的标准设备都可以用Windows 自带的标准驱动程序来驱动,当然其它特定功能除外。如果你需要在Windows系统中的DOS 模式下使用光驱,那么还需要在DOS模式下安装光驱驱动程序。多数显卡、声卡、网卡等内置扩展卡和打印机、扫描仪、外置Modem等外设都需要安装与设备型号相符的驱动程序,否则无法发挥其部分或全部功能。驱动程序一般可通过三种途径得到,一是购买的硬件附

基于51单片机的PS2键盘的单片机编程

PS2键盘的单片机编程 在单片机系统中,经常使用的键盘都是专用键盘.此类键盘为单独设计制作的,成本高、使用硬件连接线多,且可靠性不高,这一状况在那些要求键盘按键较多的应用系统中更为突出.与此相比,在PC系统中广泛使用PS/2键盘具有价格低、通用可靠,且使用连接线少(仅使用2根信号线)的特点,并可满足多种系统的要求.因此在单片机系统中应用PS/2键盘是一种很好的选择. 文中在介绍PS/2协议和PS/2键盘工作原理与特点的基础上,给出了一个在单片机上实现对PS/2键盘支持的硬件连接与驱动程序设计实现.该设计实现了在单 片机系统中对PS/2标准104键盘按键输入的支持.使用Keil C51开发的驱动程序接口和库函数可以方便地移植到其他单片机或嵌入式系统中.所有程序在 Keil uVision2上编译通过,在单片机AT89C51上测试通过. 1 PS/2协议 目前,PC机广泛采用的PS/2接口为mini-DIN 6pin的连接器,如图1所示. PS/2设备有主从之分,主设备采用Female插座,从设备采用Male插头.现在广泛使用的PS/2键盘鼠标均在从设备方式下工作.PS/2接口的时钟 与数据线都是集电极开路结构,必须外接上拉电阻(一般上拉电阻设置在主设备中).主从设备之间数据通信采用双向同步串行方式传输,时钟信号由从设备产生. 1.1 从设备到主设备的通信 当从设备向主设备发送数据时,首先检查时钟线,以确认时钟线是否为高电平.如果是高电平,从设备就可以开始传输数据;反之,从设备要等待获得总线的控制权,才能开始传输数据.传输的每一帧由11位组成,发送时序及每一位的含义如图2 所示. 每一帧数据中开始位总是为0,数据校验采用奇校验方式,停止位始终为1.从设 备到主设备通信时,从设备总是在时钟线为高时改变数据线状态,主设备在时钟 下降沿读人数据线状态.

基于linux的led驱动程序实现

基于linux的led驱动程序实现 一. 博创开发平台硬件LED的实现 博创开发平台设置了3个GPIO控制的LED和一个可直接产生外部硬件中断的按键,LED分别使用了S3C2410的GPC5,GPC6,GPC7三个GPIO,按键接到INT5中断。下面对S3C2410 GPIO的各个寄存器作出说明,用GPIO控制的LED就是通过操作GPIO的各个寄存器进行配置和操作的。S3C2410包含GPA 、GPB 、……、GPH 八个I/O端口。它们的寄存器是相似的:GPxCON 用于设置端口功能(00 表示输入、01表示输出、10 表示特殊功能、11 保留不用),GPxDAT 用于读/写数据,GPxUP 用于决定是否使用内部上拉电阻(某位为0 时,相应引脚无内部上拉;为1时,相应引脚使用内部上拉)。这里要稍微注意一点的地方是PORTA和其他几组端口的使用不太一样,这里不讨论A口,B到H组口的使用完全相同。以下是S3C2410手册上的数据[13]: 图1.1 S3C2410端口 GPC口有16个IO口,查datasheet《S3C2410》所用的地址为: 图1.2 C组GPIO的地址 即GPCCON 地址为0x56000020,GPCDAT地址为0x56000024,各位的设置具体见下图,则对应的GPCCON寄存器的位为:

图1.3 GPCCON寄存器相应的位 这里用到了5,6,7三个口,CON寄存器要完成对对应口的设置工作,将相应的口设置为输出状态,其他的口不用考虑,设置为输出的话就是0x15<<10,这样3个IO口就设置为了输出。下面就可以通过向DATA口写入低电平来点亮LED,GPCDAT的各位分布如下,每一个bit对应一个口。 图1.4 GPCDAT的位分布 GPCDAT有16位,我们这里要用到的就是5,6,7三位即将这3位设置为低电平点亮LED。具体使用情况见驱动的实现。 这三个LED的硬件原理图如下: 图1.5 GPIO控制的LED硬件原理图 二.通过GPIO控制的LED驱动程序 本驱动中没有用到内核提供的write_gpio宏,对硬件地址的操作完全自己实现,可分为以下几部分: ①模块的初始化和退出: int led_init(void)

Linux驱动程序工作原理简介

Linux驱动程序工作原理简介 一、linux驱动程序的数据结构 (1) 二、设备节点如何产生? (2) 三、应用程序是如何访问设备驱动程序的? (2) 四、为什么要有设备文件系统? (3) 五、设备文件系统如何实现? (4) 六、如何使用设备文件系统? (4) 七、具体设备驱动程序分析 (5) 1、驱动程序初始化时,要注册设备节点,创建子设备文件 (5) 2、驱动程序卸载时要注销设备节点,删除设备文件 (7) 参考书目 (8) 一、linux驱动程序的数据结构 设备驱动程序实质上是提供一组供应用程序操作设备的接口函数。 各种设备由于功能不同,驱动程序提供的函数接口也不相同,但linux为了能够统一管理,规定了linux下设备驱动程序必须使用统一的接口函数file_operations 。 所以,一种设备的驱动程序主要内容就是提供这样的一组file_operations 接口函数。 那么,linux是如何管理种类繁多的设备驱动程序呢? linux下设备大体分为块设备和字符设备两类。 内核中用2个全局数组存放这2类驱动程序。 #define MAX_CHRDEV 255 #define MAX_BLKDEV 255 struct device_struct { const char * name; struct file_operations * fops; }; static struct device_struct chrdevs[MAX_CHRDEV]; static struct { const char *name; struct block_device_operations *bdops; } blkdevs[MAX_BLKDEV]; //此处说明一下,struct block_device_operations是块设备驱动程序内部的接口函数,上层文件系统还是通过struct file_operations访问的。

检测到不兼容的键盘驱动程序。该对话框已被停用的解决方法

检测到不兼容的键盘驱动程序。该对话框已被停用的解决方法在 Windows XP 系统中单击语言栏的设置弹出“检测到不兼容的键盘驱动程序”的错误提示对话框,如遇到此问题的朋友可通过下面的方法来解决。 到一台正常 WindowsXP系统的机器,单击"开始”菜单中的“运行”命令 在“打开”框中键入“ regedit ”命令,单击“确定”按钮 打开“注册表编辑器”窗口,在左侧窗口(注册表树)定位到以下分支 Control\Keyboard Layouts 右击“ Keyboard Layouts ”主键,打开的快捷 菜单单击“导出”命令 选择要导出注册表文件的位置,并在文件名框 中输入任意名称,单击“保存”按钮 将生成的reg 文件拷贝到存储设备里,在出问 题的机器上双击该注册表文件,导入注册表信息

在 Windows XP 系统中单击语言栏的设置弹出“检测到不兼容的键盘驱动程序”的错误提示对话框,如遇到此问题的朋友可通过下面的方法来解决。 到一台正常 WindowsXP系统的机器,单击"开始”菜单中的“运行”命令 在“打开”框中键入“ regedit ”命令,单击“确定”按钮 打开“注册表编辑器”窗口,在左侧窗口(注册表树)定位到以下分支 Control\Keyboard Layouts 右击“ Keyboard Layouts ”主键,打开的快捷 菜单单击“导出”命令 选择要导出注册表文件的位置,并在文件名框 中输入任意名称,单击“保存”按钮 将生成的reg 文件拷贝到存储设备里,在出问 题的机器上双击该注册表文件,导入注册表信息

在 Windows XP 系统中单击语言栏的设置弹出“检测到不兼容的键盘驱动程序”的错误提示对话框,如遇到此问题的朋友可通过下面的方法来解决。 到一台正常 WindowsXP系统的机器,单击"开始”菜单中的“运行”命令 在“打开”框中键入“ regedit ”命令,单击“确定”按钮 打开“注册表编辑器”窗口,在左侧窗口(注册表树)定位到以下分支 Control\Keyboard Layouts 右击“ Keyboard Layouts ”主键,打开的快捷 菜单单击“导出”命令 选择要导出注册表文件的位置,并在文件名框 中输入任意名称,单击“保存”按钮 将生成的reg 文件拷贝到存储设备里,在出问 题的机器上双击该注册表文件,导入注册表信息

linux 触摸屏驱动程序设计

物理与电子工程学院 《嵌入式系统设计》 课程小论文 课题题目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.①程序是计算机的一组指令,经过编译和执行才能最终完成程序设计的动作。程序设计的最终结果是软件。 ②为了让电脑执行某项具体任务而提供给它的详细指令集合就是程序(program)。 2.字处理程序(就是我们常说的计算机语言,如C语言,BASIC等)、电脑工资表系统、电脑游戏和电子数据表都是电脑程序 3.一般来讲,程序设计风格是指编写程序时所表现出的特点,习惯和逻辑思路.因此程序设计的风格总体而言应该强调程序简单和清晰,并且是可以理解的. "清晰第一,效率第二"已成为当今主导的程序设计风格. 程序设计风格主要体现在以下几个方面: ⒈源程序文挡化 源程序文挡化应考虑如下几点: ⑴符号名的命名 符号名的命名应具有一定的实际含义,以便于对程序功能的理解. ⑵程序注释 正确的注释能够帮助读者理解程序.注释一般分为序言性注释和功能性注释.序言性注释通常位于每个程序的开头部分,它给出了程序的整体说明,主要描述内容包括:程序标题,程序功能说明,主要算法,接口说明,程序位置,开发简历,程序设计者,复审者,复审日期,修改日期等.功能性注释的位置一般嵌在源程序体中,主要描述其后的语句或程序做什么. ⑶视觉组织 为使程序的结构一目了然,可以在程序中利用空格,空行,缩进等技巧使程序的结构层次清晰 驱动程序 1.驱动程序属于什么程序?它的作用是什么? 驱动程序属于系统辅助程序一种 它的作用就是让操作系统能够全面的,详细的了解并控制的硬件 主要的驱动程序有显卡,网卡,声卡,各种外接设备比如打印机,扫描仪等等 CPU、内存这些都不需要驱动程序

linux 设备输入子系统---源代码示例。自动捕获键盘鼠标等外设消息

Linux input 子系统详解与代码示例 李邦柱于杭州2014/01/09 Email:helpylee@https://www.doczj.com/doc/95936493.html, 由于linux的驱动模型增加了input层,导致几乎所有的底层驱动都把数据封装在event里上报给input子系统。由此看来,这种改变让kernel 更具有模块化,各个模块的耦合度更低了。下面我们一起来研究input 层^_^ 1.从用户层的角度看input(event事件) 了解linux的人一定会对/dev,/ sys, /proc这几个目录有所印象,这是从内核导出到用户层的接口(从这里几乎可以观览内核)。kernel为我们导出了input在用户态的接口,就是/dev/input/下的接口,所以我们只关注这个目录下的event*(event0/event1/……)字符设备。 那么这些event*是干什么用的?简单来说就是我们对计算机的输入(包括敲击键盘,移动鼠标等等操作)经过内核(底层驱动,input)处理最后就上报到这些event*里面了。 而这里event0,event1,..就是用来区分各个外设的,可以通过命令来查看外设具体和哪个event相关联:这个命令是:cat /proc/bus/input/devices 所以我们用此命令在linux系统查看外设信息。 2.在linux/input.h中有这些数据的结构: structinput_event { structtimeval time; //事件发生的时间 __u16 type; //事件类类型:按键和移动鼠标就是不同类型 __u16 code; __s32 value; //事件值:按键a和按键b就对应不同值 }; code: 事件的代码.如果事件的类型代码是EV_KEY,该代码code为设备键盘代码.代码植0~127为键盘上的按键代码,0x110~0x116 为鼠标上按键代码,其中0x110(BTN_ LEFT)为鼠标左键,0x111(BTN_RIGHT)为鼠标右键,0x112(BTN_ MIDDLE)为鼠标中键.其它代码含义请参

驱动程序入门

什么是驱动程序? 为术语“驱动程序”给出单一的准确定义比较困难。就最基本的意义而言,驱动程序是一个软件组件,可让操作系统和设备彼此通信。例如,假设应用程序需要从设备中读取某些数据。应用程序会调用由操作系统实现的函数,操作系统会调用由驱动程序实现的函数。驱动程序(由设计和制造该设备的同一公司编写)了解如何与设备硬件通信以获取数据。当驱动程序从设备获取数据后,它会将数据返回到操作系统,操作系统将数据返回至应用程序。 扩大定义 到目前为止,我们的说明采用以下几种方式进行简单化: ?并非所有驱动程序都必须由设计该设备的公司编写。在多种情形下,设备根据已发布的硬件标准来设计。这表示驱动程序可以由Microsoft 编写,设备设计者无须提供驱动程序。 ?并非所有驱动程序都直接与设备通信。对于给定的I/O 请求(如从设备读取数据),通常有一些驱动程序(在堆栈中进行分层)参与该请求。可视化堆栈的传统方式是将第一个参与对象放在顶部,将最后一个参与对象放在底部,如此图所示。堆栈中的某些驱动程序可能通过将请求从一种格式转换至另一种格式来参与。这些驱动程序不会与设备直接通信;它们只操纵请求并将请求传递至堆栈下方的驱动程序。

堆栈中直接与设备通信的一个驱动程序称为“函数驱动程序”;执行辅助处理的驱动程序称为“筛选器驱动程序”。 某些筛选器驱动程序遵守并记录有关I/O 请求的信息,但不会主动参与这些请求。例如,某些筛选器驱动程序充当验证程序以确保堆栈中的其他驱动程序正确处理I/O 请求。 我们可以扩大“驱动程序”的定义,方法是表示驱动程序为遵守或参与操作系统与设备之间通信的任一软件组件。 软件驱动程序 我们的扩大定义相当准确,但仍不完整,原因是某些驱动程序与任何硬件设备根本不关联。例如,假设你需要编写可以访问核心操作系统数据结构的工具,这些结构仅可以由内核模式下运行的代码进行访问。可以通过将工具拆分成两个组件来执行该操作。第一个组件在用户模式下运行且提供用户界面。第二个组件在内核模式下运行且可以访问核心操作系统数据。在用户模式下运行的组件称为应用程序,在内核模式下运行的组件称为“软件驱动程序”。软件驱动程序与硬件设备不关联。有关处理器模式的详细信息,请参阅用户模式和内核模式。

相关主题
文本预览
相关文档 最新文档