驱动讲义课件.docVIP

  • 4
  • 0
  • 约3.01万字
  • 约 26页
  • 2021-01-26 发布于河北
  • 举报
驱动 TOC \o 1-2 \h \z \u 1 模块 2 1.1 模块概念 2 1.2 模块的描述规则 2 1.3 模块的编译 2 1.4 模块的使用 3 1.5 __init __exit宏 4 1.6 Printk函数 4 1.7 内核符号 4 2 设备驱动 6 2.1 linux设备驱动的三种类型 6 2.2 字符设备特点 6 2.3 字符设备的描述 6 2.4 字符设备的调试 8 2.5 linux访问外设与使用 8 2.6 自动创建设备文件 9 2.7 GPIO 10 2.8 杂项设备 11 2.9 自动安装驱动模块 12 2.10 高级字符驱动IOCTL接口 13 3 linux互斥同步与中断处理 13 3.1原子操作: 13 3.2自旋锁 14 3.3信号量与互斥锁 15 3.4等待队列 16 3.5linux中断处理 17 3.6软中断 18 3.7 内核定时器 21 1 模块 模块机制,作用提高linux操作系统的扩充性。 模块概念 动态可加载内核模块LKM。 内核空间运行。 是不是一执行文件,是一个没有经过链接,不能独立运行的一个目标文件(.c-.0-.ko) 通过insmod命令,把内核模块载入内核空间,rmmod命令 。koc从内核空间移除。 一个设备驱动的驱动代码对应一个module 模块的驱动源代码里面,使用那些头文件是在内核源代码,是不能使用C语音的库存函数。 1.2 模块的描述规则 一个简单的module: #includelinux/module.h//内核头文件 #includelinux/kernel.h Static int _init test1_init(void) //入口函数(一般放驱动初始化代码,比如申请资源,注册中断,注册字符设备。。。。) { Printk(“hello world!\n”); Return 0; } 注意:加关键字static代表的是静态函数,静态函数的调用结果不会访问或者修改任何对象(非static)数据成员,且只能本文件内使用,不能在其他文件使用,防止同名函数冲突。 Static void _exit teste1_exit(void)//出口函数(释放初始化资源) { Printk(“goodbye!\n”); } Module_init(test1_init);//驱动入口 #insmod *.ko Module_exit(test1_exit);//驱动的出口 #rmmod *.ko //#modinfo *.ko 可以查看module的信息,不是必须的 MODULE_AUTHOR(“fbx@GEC”); MODULE_DESCRIPTION(“the first module of drivers”); MODULE_LICENES(“GPL”); MODULE_VERSION(“V1.0” 注意 1. 由module_init()指定模块入口函数test_init,像应用程序main(),入口函数返回值int 0 代表成功,非0代表失败。 2. 由module_exit()宏 指定出口函数test_txit 退出函数返回值void 3. MODULE_GLICENSE等宏描述的是当前模块对应的信息。 模块的编译 Makefile文件: obj-m += module.o KERN_DIR=/home/gec/syscro/kernel/android-kernel-samsung-dev PWD := $(shell pwd) modules: $(MAKE) -C $(KERN_DIR) M=$(PWD) modules clean: $(MAKE) -C $(KERN_DIR) M=$(PWD) modules clean obj-m += module.o (module.c) //将驱动源代码编译成一个独立的module ?.ko KERN_DIR=/home/gec/syscro/kernel/android-kernel-samsung-dev 驱动源代码在编译时候,所使用内核源码包的目录路径(跟安装当前模块的内核应一致) PWD :=$(shell pwd) 当前目录 $(MAKE) –C $(KERN_DIR) M=$(PWD) modules $(MAKE) ?make -C $(KERN_DIR)?转到内核源码包的目录下执行mak

文档评论(0)

1亿VIP精品文档

相关文档