【驱动】第2课、输入子系统驱动之学习笔记

目录:
一、笔记

1、原字符驱动拆解

2、原按键字符驱动和现输入子系统驱动的区别

3、buttons.c 驱动

二、测试

1、input_keys1.c驱动测试

2、input_keys2.c驱动测试

三、复习



一、笔记
1、问题:原本的字符驱动框架被拆分为两部分,
在本例的 buttons.c 驱动中,没有用 open, read, write 等操作,只是在按键中断及其触发的系统定时器中断中得到按键值并上报,

问题:原本一套驱动程序调用的步骤被拆分为几部分了?都在哪里?如今一套按键 操作的驱动调用流程是怎样的?
答:待续...

 

2、原按键字符驱动 和 现输入子系统驱动的区别:
答:(1) 之前的字符驱动中,fops 结构有很多操作函数,其中的open函数用来 配置硬件相关的引脚/注册中断,
input.c中的 struct file_operations fops{.open}; 只一个open函数,且只起到中转的作用:在某个数组(input_table[])
里面找到 input_handler 结构,调用里面的 fops{.open, .read, .write}结构里面的操作。
(2) 原本的驱动操作在一个文件buttons_drv.c,现在被拆分为好几个文件: input.c, evdev.c, 驱动开发者自己的设备源码文件buttons.c。
(3) 工作内容:原来的需要构建整个驱动,现在只需做硬件相关,即 input_dev 相关的一部分即可。

3、buttons.c 驱动
目的:用输入子系统注册一个新字符设备--按键设备,并把按键值关联一个字符,进行按键操作并打印键值到终端 或 用键值作为输入命令;
方法步骤:
(1)分配一个 input_dev 结构体;
(2)设置该 input_dev 结构体内的元素;
(3)注册该 input_dev 结构体;
(4)硬件相关的操作:有数据产生时(即按键按下),在中断服务程序里调用 input_event() 上报事件


---------------------------------------------------------------------------------------------
二、测试
1、input_keys1.c驱动测试
nfs挂接命令:
未成功:mount -t nfs -o nolock.vers=2 192.168.1.105:/work/nfs_root/fs_second /mnt
成功: mount -t nfs -o nolock 192.168.1.105:/work/nfs_root/fs_second /mnt
实验:当未执行上面的nfs挂载到/mnt命令,直接加载驱动模块 xx.ko,然后执行 #cat /dev/tty1 命令并进行按键操作时,程序崩溃!!

文件 /etc/init.d/rcS 修改:
修改前:
#mount -t proc none /proc
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
修改后:
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
if [ ! -e /etc/pointercal ]
then
/bin/ts_cal.sh
fi
#/bin/qpe.sh & #屏蔽Qt;
<结束>
实验现象:执行# cat /dev/tty1 命令时,按键输入字符‘l’‘s’时没有打印,当执行 “Enter” 键之后,才打印,为什么?

2、input_keys2.c驱动测试
和input_keys1.c基本一样的程序,但是加载之后,无论是执行 #cat /dev/tty1 命令还是 #exec 0</dev/tty1 命令,都没有打印信息!
为什么?相同设备名字而只能注册一个吗?
答:不是,代码编写有问题:
static int keys_init(void)
{
/* 1.分配一个input_dev结构体 */ 。。。
/* 2.配置该结构体 */ 。。。
/* 3.注册该结构体 */
err = input_register_device(keys_dev2);
...
/* 4.硬件相关的操作 */
/* 4.1初始化并注册定时器 */
init_timer(&keys_timer2);
keys_timer2.function = keys_timer2_function;
add_timer(&keys_timer2);
/* 注册按键外部中断 */
...
//return 0; //程序不打印时未添加该语句!!!

err_fail:
if(err)
{
for(i--; i >= 0; i--)
free_irq(pinsdesc[i].irq, (void *)&pinsdesc[i]);
}
del_timer(&keys_timer2);
input_unregister_device(keys_dev2);
input_free_device(keys_dev2);
return err;
}
由于//return 0 语句缺失,初始化和注册成功完成之后未退出 keys_init() 函数,造成程序又继续执行了 err_fail 标识符的语句,
之前初始化和注册的程序全部回滚,等于完全没注册,驱动加载之后当然没有任何信息了!!!细心啊细心!!

------------------------------------------------------------------------------------------------
三、复习

 

posted @ 2018-12-10 22:59  大秦长剑  阅读(179)  评论(0编辑  收藏  举报