- 1、本文档共44页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第一堂课 嵌入式驱动程序开发
Linux发行版: Redhat9、Fedora7 Linux2.6.24源代码 Toolchain3.4.5(cross_compiler) S3C2410开发板 zImage(for nfs support) rootfs 三、Linux驱动程序开发环境 嵌入式Linux 系统开发的主要工作 1 . 建立交叉编译环境 2 . 引导装载程序(BootLoader)编写或移植 3 . Linux内核的移植与裁减 4 . 驱动程序的开发 5 . 文件系统的建立与移植 6 . 图形用户界面(GUI)的移植 7 . 应用程序的开发 四、Linux的驱动程序 Linux下对外设的访问只能通过驱动程序。uClinux下可以在应用层直接访问外设,操作寄存器口,但是无法处理中断、DMA、抢占、原子操作等——不推荐使用 Linux 对于驱动程序有统一的接口,以文件的形式定义系统的驱动程序: Open、Release、read、write、ioctl… 驱动程序是内核的一部分,可以使用中断、DMA等操作 驱动程序需要在用户态和内核态之间传递数据 对于复杂的应用可以考虑是用mmap 4.1存储器管理单元(MMU) Hello World 模块 返回 #include linux/init.h #include linux/module.h MODULE_LICENSE(Dual BSD/GPL); static int __init hello_init(void){ printk(KERN_ALERT Hello, world\n); return 0;} static void __exit hello_exit(void){ printk(KERN_ALERT Goodbye, cruel world\n);} module_init(hello_init); module_exit(hello_exit); 返回 Makefile(build内核模块) ifneq ($(KERNELRELEASE),) obj-m :=demo.o else #KERNELDIR ?= /home/mike/linux-2.6.20 KERNELDIR=/lib/modules/$(shell uname -r)/build PWD := $(shell pwd) default: $(MAKE) -C $(KERNELDIR) M=$(PWD) modules clean: rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c endif 模块参数 #include linux/init.h #include linux/module.h static char *who = “neusoft”; static char times= 1; module_param(times,int,S_IRUGO); module_param(who,charp, S_IRUGO); insmod hello.ko times=3 who=“zhouguoshun” 4.2 Linux下设备和模块的分类 按照上述系统内核的功能,Linux中把系统的设备定义成如下三类: 字符设备 块设备 网络设备 4.2.1.主设备号和次设备号 主设备号标识设备对应的驱动程序 一个驱动程序可以控制若干个设备,次设备号提供了一种区分它们的方法 系统增加一个驱动程序就要赋予它一个主设备号。这一赋值过程在驱动程序的初始化过程中 int register_chrdev_region( dev_t first,unsigned int count,char*name);或 int alloc_chrdev_region( dev_t *dev, unsigned int firstmonor, unsigned int count,char*name); 驱动程序使用下列宏从dev_t类型获得设备号: MAJOR(dev_t dev); MINOR(dev_t dev); 将主设备号和次设备号转换成dev_t类型: MKDEV(int major,int minor); if (scull_major) { dev = MKDEV(scull_major, scull_minor); result = register_chrdev_region(dev, scull_nr_devs, scull); } else { result = alloc_chrdev_region(dev, scull_minor, scull_nr_devs,scull); scull_major = MAJOR(
文档评论(0)