linux基础驱动

来源:互联网 发布:淘宝换货退款流程 编辑:程序博客网 时间:2024/05/18 00:43

linux高级驱动

1.linux设备模型
.bus (platform-bus)
.device
.driver 

2.具体接口驱动
1.led(基于"platform总线"的"杂项设备类"的"字符设备驱动")
2.adc 
3.lcd(framebuffer子系统)
4.ts (input子系统 + i2c总线模型)
5..

3.块设备/网络设备(dm9000)

------------------------------

单文件编译:obj-m += test.o//直接在makefile里编译一个文件即可。

--------------------------------

驱动文件调用函数中,有不同的方法。通过2种方法进行调用。
第1种是多文件编译

多文件编译:obj-m += 多文件目标.o
多文件目标-objs := 单文件一.o 单文件二.o 单文件三.o ...
就是编译时把多个文件编译到一文件里面去,
这样在主文件里,就不需要include 'xx.h'这样导入了。但还需要定义下要使用的函数

driver.c

#include<linux/kernel.h>#include<linux/init.h>#include<linux/module.h>int xx_add(int a,int b);int __init kernel_init(){printk("kernel init !\n");int data = xx_add(1,2);printk("data = %d\n",data);return 0;}void __exit kernel_exit(){printk("<4> ""kernel exit !\n");}module_init(kernel_init);//加载的函数module_exit(kernel_exit);//移除加载的函数//驱动的一些说明MODULE_LICENSE("xxLicense");MODULE_AUTHOR("XX210");MODULE_DESCRIPTION("just a driver test.");

app.c

int xx_add(int a,int b){return (a + b);}

makefile

obj-m += test-core.otest-core-objs := test.o add.o KERNEL_DIR := /home/s5pv210/android-kernel-samsung-devall:make modules -C $(KERNEL_DIR) M=`pwd`cp test.ko add.ko /root/nfs/kdevclean:make modules clean -C $(KERNEL_DIR) M=`pwd` 

------------------------------------------------------------------------------

第2种是符号导出

就是把要用到的函数,所对应的文件,也编译成ko文件。如B.ko先insmod导入内核,然后在把主的A.ko驱动文件加载内核,这样A调用了B的函数也能使用到。同样也得先定义函数。被调用的函数先insmod加载进内核。

app.c

#include <linux/module.h>int xx_add(int a,int b){return (a + b);}EXPORT_SYMBOL(xx_add);MODULE_LICENSE("GPL");
makefile

obj-m += test.o add.o KERNEL_DIR := /home/s5pv210/android-kernel-samsung-devall:make modules -C $(KERNEL_DIR) M=`pwd`cp test.ko add.ko /root/nfs/kdevclean:make modules clean -C $(KERNEL_DIR) M=`pwd` 

使用不同的方法编译,makefile和应用程序app.c文件也要对应的修改。主驱动driver.c文件看情况。

参考:

http://coolshell.cn/articles/566.html

http://blog.51cto.com/zt/369

http://huxiongwei.spaces.eepw.com.cn/articles/article/item/74756

http://oss.org.cn/kernel-book/ldd3/ch01s04.html

http://blog.csdn.net/fudan_abc/article/details/5756323

附:

1、printk

显示条件: 打印级别  》 显示级别

那些内核启动的信息,就是printk出来的。

2、 cat /proc/devices
查看下是否有一个name="led-xx"-》这个是你定义的设备名称,确保一开始有没有加载

3、insmod driver.ko加载模块,insmod,重启后会自动移除驱动。

然后用lsmod查看是否加载成功,就会显示对应的led模块。

再次查看cat /proc/devices
就会发现你加载的设备名称

4、用modinfo查驱动文件作者等信息时,报错说没有....
就自己touch创建一个,然后再modinfo -a xx.ko就好。

0 0
原创粉丝点击