第二章4自动创建设备文件_第1页
第二章4自动创建设备文件_第2页
第二章4自动创建设备文件_第3页
第二章4自动创建设备文件_第4页
第二章4自动创建设备文件_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

NeusoftInstituteofInformation嵌入式系统工程系--嵌入式Linux设备驱动开发目录一ARM体系结构三Linux板级LED驱动程序二GPIO访问作品简介Linux内核访问外设I/O资源的方式一、动态映射(ioremap)方式对I/O内存的操作需按如下步骤完成:

1.申请structresource*request_mem_region(unsignedlongstart,unsignedlonglen,char*name)

2.映射void*ioremap(unsignedlongphys_addr,unsignedlongsize)

3.访问unsignedioread8(void*addr)voidiowrite8(u8value,void*addr)

4.释放voidiounmap(void*addr)Linux内核访问外设I/O资源的方式一、动态映射(ioremap)方式定义#defineS3C2410_PA_IIS (0x55000000)映射our_card->regs=ioremap(S3C2410_PA_IIS,0x100);

访问readl(our_card->regs)writel(value,our_card->regs)Linux内核访问外设I/O资源的方式二、静态映射(map_desc)方式

通过map_desc结构体静态创建I/O资源映射表

内核或驱动中访问该I/O资源时则无需再进行ioreamp动态映射,可以直接通过映射后的I/O虚拟地址去访问./*include/asm-arm/mach/map.h*/

structmap_desc{

unsignedlongvirtual;

/*映射后的虚拟地址*/

unsignedlongpfn;

/*I/O资源物理地址所在的页帧号*/

unsignedlonglength;

/*I/O资源长度*/

unsignedinttype;

/*I/O资源类型*/

};二、静态映射(map_desc)方式staticstructmap_descs3c2410_iodesc[]__initdata={

{

.virtual

=

(unsignedlong)S3C24XX_VA_LCD),

.pfn

=

__phys_to_pfn(S3C24XX_PA_LCD),

.length

=

S3C24XX_SZ_LCD,

.type

=

MT_DEVICE

},

……

};Map_io成员函数会在系统初始化过程中被调用,流程如下:Start_kernel->setup_arch()-->paging_init()-->devicemaps_init()中被调用.

自动创建设备文件

创建设备文件的方法:

1.mknod手工创建

2.?自动创建(2.4内核)devfs_register(devfs_handle_tdir,constchar *name,unsignedintflags,unsignedint major,unsignedintminor,umode_tmode,void*ops, void*info)在指定的目录中创建设备文件。dir:目录名,为空表示在/dev/目录下创建;name:文件名;flags:创建标志;major:主设备号;minor:次设备号;mode:创建模式;ops:操作函数集;info:通常为空

自动创建(2.6内核)从Linux2.6.13开始,devfs不复存在,udev成为devfs的替代。相比devfs,udev(mdev)存在于应用层。利用udev(mdev)来实现设备文件的自动创建很简单,在驱动初始化的代码里调用class_create为该设备创建一个class,再为每个设备调用device_create创建对应的设备。自动创建(2.6内核)例:structclass*myclass=class_create(THIS_MODULE, “my_device_driver”);class_device_create(myclass,NULL,MKDEV(major_num,0),NULL, “my_device”);当驱动被加载时,udev(mdev)就会自动在/dev下创建my_device设备文件。staticstructclass*led_class;if(LED_MAJOR){ dev=MKDEV(LED_MAJOR,LED_MINOR); result=register_chrdev_region(dev,scull_nr_devs,"DEVICE_NAME

"); }else{ result=alloc_chrdev_region(&dev,LED_MINOR,scull_nr_devs,"DEVICE_NAME

"); LED_MAJOR=MAJOR(dev); }//注册一个类,使mdev可以在"/dev/"目录下面建立设备节点

led_class=class_create(THIS_MODULE,DEVICE_NAME); if(IS_ERR(led_class)) { printk("Err:failedinNeusoft-ledsclass.\n"); return-1; } //创建一个设备节点,节点名为DEVICE_NAME

class_device_create(led_class,NULL,MKDEV(LED_MAJOR,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论