原因在于:write中的char *buf应该为const char *buf;ioctl中的long data为unsigned long data
2.6中的irqreturn函数中只有两个参数了,原来的irqreturn_t int_interrupt(int irq,void * dev_id,struct pt_regs *regs);应该是irqreturn_t int_interrupt(int irq,void * dev_id);
原来头文件里没有SA_INTERRUPT了,一般使用IRQF_SHARED了。
rquest_irq(PRINT_IRQ,int_interrupt,IRQF_SHARED,INT_DEV_NAME,NULL);
2.4内核中中断的注册和注销使用的头文件#include <linux/shed.h>
2.6内核中中断的注册和注销使用的头文件#include <linux/interrupt.h>
1.可用的主设备号范围如下:60~63 120~127 240~254
2.主设备号10的次设备号中240~255范围也用在测试或特定平台上。
1输出可标记等级,默认为KERN_WARNNING,等同于下面几句:
printk("<4>" "system ok\n");
printk("<4> system ok\n");
printk("system ok\n");
2.必须使用“\n”字符,否则调试过程混乱。当不使用它时,下一条输出会紧接着前一句,而且会输出标记级别。
如printk(“hello world”);printk(“goodbye\n”);则输出时为hello world<6>goodbye.
1.为什么普通用户在执行./test的时候,总是提示设备文件打开出错,而用root用户执行./test的时候就成功了呢?
测试解决了,在root用户下将设备文件访问权限改为666,再就可以了。
2.一个设备文件,不能同时被两个设备同时使用。先打开的成功,后打开的出错。
1解压好2.6.18内核,并修改内核目录inux-2.6.18下的Makefile,更改ARCH,和CROSS_COMPILE值。
ARCH := arm
CROSS_COMPILE := /usr/local/arm/3.4.1/bin/arm-linux-
如果没有设置好,在编译驱动的时候将会出错。并且先进行make modules之后再编译驱动.
2编译好驱动代码后写一个Makefie,注意加上COSS_ARCH变量,其中包含了两个选项,即ARCH,和CROSS_COMPILE
#Makefile for linux 2.6 kernel
obj-m+=hello.o
KDIR :=/home/ok/kernel/linux-2.6.18
PWD:=$(shell pwd)
#KERNELHEAD := /home/ok/kernel/linux-2.6.18/include,2.6核不用到。
CROSS_ARCH := ARCH=arm CROSS_COMPILE=arm-linux-
default:
$(MAKE) $(CROSS_ARCH) -C $(KDIR) SUBDIRS=$(PWD) modules
clean:
rm -rf *.cmd *.o *.mod.c *.ko