驱动程序嵌入式系统.pptVIP

  • 13
  • 0
  • 约8.29千字
  • 约 33页
  • 2017-06-20 发布于福建
  • 举报
驱动程序嵌入式系统

驱动硬件是操作系统最基本的功能。它通过驱动程序来操作硬件。 驱动程序是内核和硬件之间的接口,为应用程序屏蔽了硬件的细节。 驱动程序最为操作系统最基本组成部分,具有以下功能: 对设备初始化和释放。驱动程序要完成设备注册,初始化及对设备的卸载 数据传送。驱动程序最重要的功能就是在内核,硬件和应用程序之间传送数据。即把数据从内核传到硬件和从硬件读取数据;读取应用程序传给设备文件的数据和回送应用程序要求的数据 检测和处理设备出现的错误。 驱动程序通常是以内核模块的形式加载进内核 或直接 编译进内核,(但编译进内核是某些驱动运行的唯一方法。例如:console驱动,flash驱动和对至少一种文件系统的支持等等。)是内核的一部分。与应用程序的执行过程不同,模块通常只是预先向内核注册自己,当内核需要时响应请求。 用户的应用程序以设备文件方式访问驱动程序。即linux把设备当文件,通过文件系统对设备进行访问 所有的设备的驱动程序有共性,了解驱动程序的结构,对嵌入式系统的开发有价值 Linux的设备管理 嵌入式Linux设备驱动程序的设计大致包括以下步骤: 向系统申请也可以动态获得主、次设备号。 实现设备初始化和卸载模块。(以模块方式) 设计对设备文件操作。如定义file_operations结构。 设计对设备文件操作调用。如read、write等操作。 实现中断服务函数,用request_irq向内核注册。 将驱动程序编译到内核或编译成模块,用ismod命令加载。 生成设备节点文件。 应用程序与内核模块的比较 源程序:有main();没有main(内核模块结构) 编译:gcc;gcc加参数(幻33) 运行:运行命令;模块加载(用命令insmod rmmod 或内核裁减,以模块方式或编译进内核,由内核需要时调用) 内核模块结构 #include linux/kernel.h // 说明是个内核功能 #include linux/module.h // 声明是一个模块 … …  // 其它header信息 int init_module( ) { … … // 加载时,初始化模块的编码 如注册register_chrdev } … … … … // 期望该模块所能实现的一些功能函数,如open()、 release()、write()、 read()、ioctl()等函数 … … void cleanup_module( ) { … … // 卸载时,注销模块的编码 } Linux内核模块结构介绍 #include linux/module.h //所有模块都需要的头文件 #include linux/init.h // initexit相关宏 static int __init hello_init (void) {  printk(Hello module init\n);  return 0; } Linux内核模块结构介绍 static void __exit hello_exit (void) {  printk(Hello module exit\n); } module_init(hello_init); module_exit(hello_exit); Linux内核模块结构介绍 gcc -D__KERNEL__ -DMODULE -DLINUX -I /usr/src/linux2.4/include -c -o hello.o hello.c insmod ./hello.o ………… rmmod hello 驱动程序的测试 在该驱动模块程序编译加载后,再在/dev目录下创建模块设备文件chrdev,使用命令: #mknod /dev/chrdev c major minor 其中“c”表示moduledev是字符设备,“major”是moduledev的主设备号。(该字符设备驱动程序编译加载后,可在/proc/devices获得主设备号) 函数scull_open()的流程图 图8-5 函数scull_write()的流程图 图8-6 函数scull_read()的流程图 图8-7 函数scull_ioctl()的流程图 图8-8 函数scull_release()的流程图 图8-9 字符设备驱动程序的测试函

文档评论(0)

1亿VIP精品文档

相关文档