S3C2410设备驱动程序..ppt

  1. 1、本文档共46页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
S3C2410设备驱动程序.

* 初始化中断控制器和打开/关闭中断 中断控制器的初始化应该在操作系统启动阶段的中断初始化阶段完成了。操作系统的移植者已经帮我们完成了这个工作。然而,对某些微控制器,它的管脚可能是复用的,而缺省状态又不是作为中断输入引脚,这时如果打开中断,可能造成系统“死掉”,比如电平响应的中断,将不停地执行中断响应程序,导致系统其它代码没有机会运行。 static int spioc_open(...) { ... enable_irq(IRQ_EINT4); ... } static int spioc_close(...) { ... disable_irq(IRQ_EINT4); ... } * 使用devfs 注意,是否能使用devfs与内核是否支持这个特性相关。内核在编译时应该设定CONFIG_DEVFS_FS宏。我们还可以使用动态获得的设备号。 #include linux/devfs_fs_kernel.h static devfs_handle_t devfs_spioc; static int __init spioc_init(...) { int result; ... result = devfs_register_chrdev(0, spioc_fops); if(result 0) return result; spioc_major = result; devfs_spioc = devfs_register(NULL, spioc, DEVFS_FL_DEFAULT, spioc_major, 0, S_IFCHR | S_IRUSR | S_IWUSR, spioc_fops, NULL); ... } static void __exit spioc_exit(void) { ... devfs_unregister(devfs_spioc); devfs_unregister_chrdev(spioc_major, spioc); ... } * 块设备 块设备基本概念:块操作为基础,速度是主要考虑因素,类型复杂。 与字符设备相似之处:注册/撤消,设备号,block_device_operations。 块设备的基本操作 块设备的读写:request。 其它特性:如可移动性,分区等。 块设备的加载和卸载:文件系统。 * 面向块数据的操作,数据块的大小主要由经验值来确定,一般为2的整数幂次字节大小,如4kB, 16kB等。 块设备是用于存储大量数据的设备,主要是各种数据存储介质设备,如硬盘,软盘,光盘,以及U盘等。 出于效率的要求,块设备的数据传输几乎都使用较大的缓冲区,并使用请求队列。 块设备主要由文件系统使用,因此,块设备上几乎都要建立文件系统,要有磁盘分区。 应用几乎不直接使用块设备,而是通过文件系统使用块设备,如各种应用程序从磁盘的文件中读数据和向磁盘文件写入数据。 块设备的操作要比字符设备复杂许多,如磁盘电机的启动/停止操作,磁盘坏块的处理等。 块设备在/dev目录下有相应的设备文件,有主设备号和次设备号。每个磁盘有一个主设备号,一个磁盘上得不同分区使用不同的次设备号。 速度和效率是块设备要考虑的主要因素,为提高效率,块设备驱动程序一般都实现一定程度的预读功能。 由于使用了缓冲区,磁盘中的数据需要经常与系统缓冲的数据保持同步。否则会导致文件系统崩溃。 块设备基本概念 * 块设备的注册和注销 #inclide linux/fs.h int register_blkdev(unsigned int major, const char *name, struct block_device_operations *bdops); int unregister blkdev(unsigned int major, const char *name); struct block_device_operations { int (*open)(struct inode *inode, struct file *filp); int (*release)(struct inode *inode, struct file *filp); int (*ioctl)(struct inode *inode, struct file *filp, unsigned command, unsigned long arg); int (*check_media_change)(kdev_t dev); int (*revalidate)(kdev_t dev); }; #include linux/blkdev.h extern void

文档评论(0)

叮当文档 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档