随笔分类 -  linux 驱动

摘要:linux内核版本:linux-2.6.30.4目的:当按下K1,K2,K3,K4时,分别代表输入L、S、ENTER、LEFTSHIFT经过上一节知道,在我们写驱动的时候input核心层和handler层都不需要修改,要修改的只是input_device层。写一个符合input子系统驱动程序的步骤:1.分配一个input_device结构体;2.设置3.注册4.硬件相关代码,比如中断服务程序里上报事件 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #inc... 阅读全文
posted @ 2013-08-08 11:25 linux_rookie 阅读(1119) 评论(0) 推荐(0)
摘要:输入子系统的核心代码在/driver/input/input.c,先看入口函数input_init(),在这里调用了register_chrdev(INPUT_MAJOR, "input", &input_fops);内核帮我们做了注册设备号的工作,发现在结构体input_fops里只定义了open函数,像read,write等函数都没有定义,进入这个open函数去看看有什么内容:input_open_file() struct input_handler *handler handler = input_table[iminor(inode) >> 5 阅读全文
posted @ 2013-08-08 11:24 linux_rookie 阅读(716) 评论(0) 推荐(0)
摘要:linux内核版本:linux-2.6.30.4目的:我们前面写的几个驱动程序不管是查询方式、中断方式还是poll方式,都要求我们应用程序去主动的查询,看有没有按键发生,要想实现不需要让应用程序主动去查询,而是按键产生后,由驱动主动告诉应用,就要实现异步通知方式。为了使设备支持异步通知机制,驱动程序中涉及以下3项工作:1.支持F_SETOWN命令,能在这个控制命令处理中设置file->f_owner为对应进程ID,不过此项工作已由内核完成,设备驱动无须处理2.支持F_SETFL命令的处理,每当FASYNC标志改变时,驱动程序中的fasync()函数将得以执行,驱动中应该实现fasync( 阅读全文
posted @ 2013-08-08 11:20 linux_rookie 阅读(569) 评论(0) 推荐(0)
摘要:linux内核版本:linux-2.6.30.4目的:我们在中断方式的按键应用程序中,如果没有按键按下,read就会永远在那等待,所以如果在这个程序里还想做其他事就不可能了。因此我们这次改进它,让它在等待5秒钟,如果5秒钟内没有按键按下就返回,可以在read后面做其他事,只需要在驱动程序里加入poll机制就可以完成目的。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 ... 阅读全文
posted @ 2013-08-08 11:19 linux_rookie 阅读(763) 评论(0) 推荐(0)
摘要:linux内核版本:linux-2.6.30.4目的:当有按键按下和松开时,在终端输出不同的键值原理:假设我们现在已经加载(insmod)了third_drv.ko,当我们进入main函数后,可以打开设备节点"/dev/buttons",然后进入while循环,接着系统调用read,内核经过一系列的处理,进入到我们的驱动程序的read函数(third_drv_read),这时候如果没有按键按下,应用程序就会停在wait_event_interruptible处休眠,程序就不会向下面跑了,假如在某个时间点我们按下了按键,就会触发中断,调用中断处理函数(buttons_irq) 阅读全文
posted @ 2013-08-08 11:17 linux_rookie 阅读(535) 评论(0) 推荐(0)
摘要:linux内核版本:linux-2.6.30.4目的:当有按键按下时,在终端输出信息 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 11 static struct class *second_drv_class; 12 static struct class_device *second_drv_class_dev; 13 14 static volatile unsigned... 阅读全文
posted @ 2013-08-08 11:12 linux_rookie 阅读(710) 评论(0) 推荐(0)
摘要:需要下载yaffs2-d43e901.tar.gz,busybox-1.13.0.tar.bz2使用的交叉编译器是4.331.修改配置编译busybox修改MakefileCROSS_COMPILE = arm-linux-ARCH = armmake menuconfig 根据实际情况来进行配置make; make install2. 构建文件系统建立一个目录root_2.6.30.4,复制上面编译出来的busybox的“bin”目录,“sbin”目录,“usr”目录和“linuxrc”到root_2.6.30.4目录下,然后mkdir -p dev etc /home/sky lib mn 阅读全文
posted @ 2013-08-08 11:02 linux_rookie 阅读(448) 评论(0) 推荐(0)
摘要:为了制作一个文件系统,首先要用busybox编译出文件系统所需要的应用程序。在下载了busybox-1.13.0.tar.bz2后,编译出现如下错误:In file included from /opt/EmbedSky/4.3.3/bin/../arm-none-linux-gnueabi/libc/usr/include/linux/if_tunnel.h:5, from networking/libiproute/iptunnel.c:24:/opt/EmbedSky/4.3.3/bin/../arm-none-linux-gnueabi/libc/usr/include/... 阅读全文
posted @ 2013-08-08 11:01 linux_rookie 阅读(564) 评论(0) 推荐(0)
摘要:硬件环境:TQ2440 软件环境:linux-2.6.30.4下载源码:ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.30.4.tar.bz2步骤:1.在系统中添加对arm的支持:修改内核根目录下的Makefile,ARCH=arm,CROSS_COMPILE=arm-linux-2.修改系统时钟:修改内核源码“arch-arm-mach-s3c2440/mach-smdk2440.c”,把s3c24xx_init_clocks(16934400); 换成s3c24xx_init_clocks(12000000);3. 修改机器码:把 阅读全文
posted @ 2013-08-08 10:54 linux_rookie 阅读(228) 评论(0) 推荐(0)
摘要:我们知道,字符设备编写可以分为以下几个步骤1)确定主设备号major2)构造file_operations 结构体fops3)register_chrdev(major,name, fops)4)入口函数5)出口函数那么LCD驱动也是字符设备驱动,肯定也会有这几个步骤,下面来看以下/drivers/video/fbmem.c首先看入口函数fbmem_init()1 register_chrdev(FB_MAJOR,"fb",&fb_fops) //FB_MAJOR:29构成字符设备的主要要素都有了,下面主要来看file_operations 结构体fb_fops 1 阅读全文
posted @ 2013-04-08 00:49 linux_rookie 阅读(536) 评论(0) 推荐(0)
摘要:在写好设备驱动后,怎样才能和设备联系起来呢(主要是获取设备的地址信息)?老方法就不说了,网上一堆,(老方法是实现i2c_driver的attach_adapter和detach_client,新方法是实现probe等函数)实现的方法有好几种,具体参见内核文档\Documentation\i2c\instantiating-devices,都是英文,看的不是太懂,也就不翻译了,我是用的第2种方法,这种方法可以直接在自己写的驱动代码里实现,第一种方法还要重新编译内核才行static struct i2c_board_info at24cxx_info[] ={ { I2C_BOARD_INFO(. 阅读全文
posted @ 2013-04-05 18:49 linux_rookie 阅读(218) 评论(0) 推荐(0)
摘要:在今天的触摸屏程序中,通过cat /proc/interrupts 看到中断也注册成功了,就是在屏上点击没有反应,后来经常查找发现原来是在获取时钟时用的:ts_dev->clk = clk_get(&pdev->dev, "ts_clk");获取失败,自己又没有判断返回值,所以搞了2天才知道是什么原因,改成ts_dev->clk = clk_get(NULL, "ts_clk");就可以了,以后在驱动中要加上必要的打印,可以在出现错误时及时的发现。自己总了一下常见的触摸屏不能触发中断的原因主要有:1)没有把内核自带的触摸屏和AD 阅读全文
posted @ 2013-04-05 18:47 linux_rookie 阅读(671) 评论(0) 推荐(0)