08 2013 档案
摘要: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...
阅读全文
摘要:输入子系统的核心代码在/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
阅读全文
摘要:linux内核版本:linux-2.6.30.4目的:我们前面写的几个驱动程序不管是查询方式、中断方式还是poll方式,都要求我们应用程序去主动的查询,看有没有按键发生,要想实现不需要让应用程序主动去查询,而是按键产生后,由驱动主动告诉应用,就要实现异步通知方式。为了使设备支持异步通知机制,驱动程序中涉及以下3项工作:1.支持F_SETOWN命令,能在这个控制命令处理中设置file->f_owner为对应进程ID,不过此项工作已由内核完成,设备驱动无须处理2.支持F_SETFL命令的处理,每当FASYNC标志改变时,驱动程序中的fasync()函数将得以执行,驱动中应该实现fasync(
阅读全文
摘要: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 ...
阅读全文
摘要:linux内核版本:linux-2.6.30.4目的:当有按键按下和松开时,在终端输出不同的键值原理:假设我们现在已经加载(insmod)了third_drv.ko,当我们进入main函数后,可以打开设备节点"/dev/buttons",然后进入while循环,接着系统调用read,内核经过一系列的处理,进入到我们的驱动程序的read函数(third_drv_read),这时候如果没有按键按下,应用程序就会停在wait_event_interruptible处休眠,程序就不会向下面跑了,假如在某个时间点我们按下了按键,就会触发中断,调用中断处理函数(buttons_irq)
阅读全文
摘要: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...
阅读全文
摘要:这次我们要做的是点亮4个led灯首先看TQ2440原理图,由图1可知,只需在nLED_1、nLED_2、nLED_3、nLED_4输入低电平即可(对S3C2440来说是输出),然后查看这4根线与CPU怎么连接的,经过图2可以看出它们4个分别与GPB5、GPB6、GPB7和GPB8相连,也就是CPU通过这4个端口输出低电平到led灯,把这4个端口配置成输出,然后在对应数据寄存器相应位上写入0就可以实现点灯。 图1 图2代码 (led.c) 1 #define GPBCON (*(volatile unsigned long *)0x56000010) 2 #de...
阅读全文
摘要:2.1 基本寻址方式1) 寄存器寻址2)立即数寻址立即数寻址指令中的地址码部分就是操作数本身,也就是说,数据就包含在指令中,由于立即数在32位机器码中,不可能用32位来表示立即数(因为还有操作码),事实上,ARM机器指令中,仅用了低12位来表示立即数,但这并不是表示立即数的范围为-2048—2047,它可以表示,只不过它只能表示其中的个数字而已,ARM是这样用12bit来表示立即数的:将12bit划分为两部分——高4位和低8位,将低8位补0扩展为32位,然后循环右移X位(X=高4位表示的无符号整数X2)3)寄存器间接寻址寄存器中存放的是操作数的地址指针,如:LDR R0,[R2] 表示将R2中
阅读全文
摘要:1.1 ARM CPU寄存器ARM的汇编编程,本质上就是针对CPU寄存器的编程,所以要搞清楚ARM有哪些寄存器;ARM寄存器分为两类:普通寄存器和状态寄存器;普通寄存器一共有16个,分别为R0——R15,状态寄存器有2个,分别为CPSR和SPSR。R15别名PC(program Counter),中文称程序计数器,它的值是当前正在执行的指令在内存中的位置,而当指令执行结束后,CPU硬件会自动将PC值加1,使PC指向下一条即将执行的指令,因此,当对PC寄存器赋值时,也就相当于完成了一次无条件跳转;R14别名LR(Linked Register),中文称为链接寄存器,用于存放子程序的返回地址,与子
阅读全文
摘要:需要下载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
阅读全文
摘要:为了制作一个文件系统,首先要用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/...
阅读全文
摘要:用insmod加载驱动模块成功后,用rmmod无法卸载解决方法:在板子上建立一个空目录:lib/modules/2.6.30.4/
阅读全文
摘要:移植yaffs2文件系统时,首先要在内核中添加对yaffs2的支持,使用命令:./patch-ker.sh c 内核目录时,出现下面错误:usage: ./patch-ker.sh c/l m/s kernelpathif c/l is c, then copy. If l then linkif m/s is m, then use multi version code. If s then use single version code
阅读全文
摘要:硬件环境: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. 修改机器码:把
阅读全文
浙公网安备 33010602011771号