文件在:Drivers/char/kconfig;
tristate三态表示可以编译在模块
bool表示只能被选择编[*]或不编[ ]。
make menuconfig后会自动生成供编译的.config文件。
wuchengbing@ubuntu:~/linux/kernel-2.6.13$ make menuconfig Device Drivers ---> Character devices ---> [*] S3C2410 RTC Driver │ │QQ2440/mini2440 LEDs Driver │ │ QQ2440/mini2440 PWM beeper Driver │ │ QQ2440/mini2440 Hello Module sample │ │ QQ2440 Buttons
如果make menuconfig没有出来该选项,可先cp config_n35 .config->make-> make menuconfig,然后成生如下.config文件。
wuchengbing@ubuntu:~/linux/kernel-2.6.13$ gedit .config # CONFIG_WATCHDOG is not set # CONFIG_NVRAM is not set # CONFIG_RTC is not set CONFIG_S3C2410_RTC=y CONFIG_QQ2440_LEDS=m CONFIG_QQ2440_PWM_BEEPER=y CONFIG_QQ2440_HELLO_MODULE=m … …第三步:编译内核得到驱动模块
make
wuchengbing@ubuntu:~/linux/kernel-2.6.13$make … … LD vmlinux SYSMAP System.map SYSMAP .tmp_System.map OBJCOPY arch/arm/boot/Image Kernel: arch/arm/boot/Image is ready AS arch/arm/boot/compressed/head.o GZIP arch/arm/boot/compressed/piggy.gz AS arch/arm/boot/compressed/piggy.o CC arch/arm/boot/compressed/misc.o LD arch/arm/boot/compressed/vmlinux OBJCOPY arch/arm/boot/zImage Kernel: arch/arm/boot/zImage is ready Building modules, stage 2. MODPOST CC drivers/char/mini2440_backlight.mod.o LD [M] drivers/char/mini2440_backlight.ko CC drivers/char/qq2440_buttons.mod.o LD [M] drivers/char/qq2440_buttons.ko CC drivers/char/qq2440_hello_module.mod.o LD [M] drivers/char/qq2440_hello_module.ko CC drivers/char/qq2440_leds.mod.o LD [M] drivers/char/qq2440_leds.ko CC drivers/char/qq2440_pwm.mod.o LD [M] drivers/char/qq2440_pwm.ko wuchengbing@ubuntu:~/linux/kernel-2.6.13$
qq2440_leds.ko
wuchengbing@ubuntu:~/linux/kernel-2.6.13$ ls driver/char/ … -rw-rw-r-- 1 wuchengbing wuchengbing 1368 Apr 17 20:38 qq2440_hello_module.o -rw-rw-r-- 1 wuchengbing wuchengbing 3108 Apr 17 20:38 qq2440_pwm.o -rw-rw-r-- 1 wuchengbing wuchengbing 1412 Apr 17 20:39 qq2440_hello_module.mod.o -rw-rw-r-- 1 wuchengbing wuchengbing 2247 Apr 17 20:39 qq2440_hello_module.ko -rw-rw-r-- 1 wuchengbing wuchengbing 1404 Apr 17 20:39 qq2440_leds.mod.o -rw-rw-r-- 1 wuchengbing wuchengbing 3133 Apr 17 20:39 qq2440_leds.ko -rw-rw-r-- 1 wuchengbing wuchengbing 1404 Apr 17 20:39 qq2440_pwm.mod.o -rw-rw-r-- 1 wuchengbing wuchengbing 3957 Apr 17 20:39 qq2440_pwm.ko
./mkimage.sh
wuchengbing@ubuntu:~/linux/kernel-2.6.13$ cd arch/arm/boot/ wuchengbing@ubuntu:~/linux/kernel-2.6.13/arch/arm/boot$ ./mkimage.sh Image Name: linux-2.6.13 Created: Mon Apr 17 20:33:08 2017 Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 1537008 Bytes = 1500.98 kB = 1.47 MB Load Address: 0x30008000 Entry Point: 0x30008040 wuchengbing@ubuntu:~/linux/kernel-2.6.13/arch/arm/boot$第四步:拷贝到文件系统,挂载板子,插入模块
运行示例程序编译出来的./a.out,板子的LED就会亮了。
License问题很需要在驱动代码加入MODULE_LICENSE("GPL");
... ... module_init(qq2440_leds_init); module_exit(qq2440_leds_exit); MODULE_LICENSE("GPL");示例程序
应用程序,通过驱动调用板子LED。
#include#include #include #include int main(void) { int fd; int i = 0; fd = open("/dev/leds",O_RDONLY); if(fd==-1) { perror("open failed"); exit(1); } while(1) { ioctl(fd,0,0); ioctl(fd,0,1); ioctl(fd,0,2); ioctl(fd,0,3); sleep(1); ioctl(fd,1,0); ioctl(fd,1,1); ioctl(fd,1,2); ioctl(fd,1,3); sleep(1); } return 0; }
开发板自带的led程序(qq2440_leds_init)【被module_init调用—-知道这里就行了】
怎么知道设置231
http://blog.csdn.net/zjjyliuweijie/article/details/7001383
设置为231是因为231没有人使用。
file_operations中各项解析
http://blog.csdn.net/sunsea1026/article/details/6586143
THIS_MODULE在代码中复制给了owner,owner顾名思义是属主的意思,当把THIS_MODULE复制给owner,表示该结构体属于当前模块,那么当前模块又是谁呢?当前模块就是:
用不用goto一直是一个著名的争议话题,Linux内核源码中对goto的应用非常广泛,但一般只局限于错误处理中!这种goto用于错误处理的用法实在是简单而高效,只需保证在错误处理的时候记得注销,释放资源等!(与正常的注册,申请资源顺序相反)
当major为真的时候返回0,是什么意思呢? Major为真的情况,只有可能>0,因为major的类型是unsigned。所以,当major大于0的时候,函数返回0,表示函数执行成功!
Major为假的情况,只有一种情况,等于零。那么major=0,表示什么呢?
当在调用register_chrdev函数的时候,
如果传进去的major=0,表示自己不定义设备号,由系统自动分配! 如果传进去的major>0,表示传入自己定义的设备号,不用系统自动分配!我们是怎么知道的?
ENOMEM是什么?
现在能猜出cdev_add返回什么吗?
Device FileSystem Make CharDevice
主要实现在文件系统下面建立一个设备文件,设备文件的名称就是DEVICE_NAME;
Make Device
Chmod ,0777,umask
[转载]stat函数与结构体
http://blog.sina.com.cn/s/blog_6dd1df4e0100o50q.html
下面是驱动成功注册后,在文件系统中生成的设备文件。
这里s3c2410_gpio_cfgpin和s3c2410_gpio_setpin就对接上篇文章《ARM接口技术》原理了。