• linux内核驱动开发


    系列文章目录

    主要介绍linux系统下的驱动开发

     

     


    前言

    设备驱动最通俗的解释就是“驱使硬件设备行动”。驱动与底层硬件直接打交道,按照硬件设备的具体工作方式,读写设备的寄存器,完成设备的轮询、中断处理、DMA通信,进重行物理内存向虚拟内存的映射等,最终让通信设备能收发数据,让显示设备能显示文字和画面,让存储设备能记录文件和
    数据。

    一、驱动是什么?

    由此可见,设备驱动充当了硬件和应用软件之间的纽带,应用软件时只需要调用系统软件的应用编程接口(API)就可让硬件去完成要求的工作。在系统没有操作系统的情况下,工程师可以根据硬件设备的特点自行定义接口,如对串口定义SerialSend()、SerialRecv(),对LED定义LightOn()、LightOff(),对Flash定义FlashWr()、FlashRd()等。而在有操作系统的情况下,驱动的架构则由相应的操作系统定义,驱动工程师必须按照相应的架构设计驱动,这样,驱动才能良好地整合入操作系统的内核中。驱动程序负责硬件和应用软件之间的沟通,而驱动工程师则负责硬件工程师和应用软件工程师之间的沟通。

    二、主要分类

    计算机系统的硬件主要由CPU、存储器和外设组成。随着IC制作工艺的发展,目前,芯片的集成度越来越高,往往在CPU内部就集成了存储器和外设适配器。譬如,相当多的ARM、PowerPC、MIPS等处理器都集成了UART、I2C控制器、SPI控制器、USB控制器、SDRAM控制器等,有的处理器
    还集成了GPU(图形处理器)、视频编解码器等。驱动针对的对象是存储器和外设(包括CPU内部集成的存储器和外设),而不是针对CPU内核。Linux将存储器和外设分为3个基础大类。
    ·字符设备。那些必须以串行顺序依次进行访问的设备,如触摸屏、磁带驱动器、鼠标等
    ·

    块设备。块设备可以按任意顺序进行访问,以块为单位进行操作,如硬盘、eMMC等。

    ·网络设备,
    网络设备面向数据包的接收和发送而设计,它并不倾向于对应于文件系统的节点。内核与网络设备的通信与内核和字符设备、网络设备的通信方式完全不同,前者主要还是使用套接字接口。

     

    2.读入数据

    设备驱动与整个系统的关系除网络设备外,字符设备与块设备都被映射到Linux文件系统的文件和目录,通过文件系统的系统调用接口open()、write()、read()、close()等即可访问字符设备和块设备。所有字符设备和块设备都统一呈现给用户。Linux的块设备有两种访问方法:一种是类似dd命令对应的原始块设备,如“/dev/sdb1”等;另外一种方法是在块设备上建立FAT、EXT4、BTRFS等文件系统,然后以文件路径如“/home/barry/hello.txt”的形式进行访问。

    3.代码示例

    1. Linux下的LED驱动
    2. #include.../
    3. struct light_dev{
    4. struct cdev cdev;/ 字符设备cdev结构体
    5. unsigned char vaule;/ led亮是为1,熄灭时为0/
    6. }
    7. struct light_dev *light_devp;
    8. int light_major =LIGHT_MAJOR;
    9. MODULE_AUTHOR(“wuhuaming<whm128@yeah.ney>”)
    10. MODULE_LICENSE(“Dual BSD/GPL“)
    11. int light_open(struct inode *inode,struct file *filp)
    12. {
    13. struct light_dev *dev;
    14. dev=contain_of(inode->i_cdev,struct light_dev,cc)
    15. filp->private_data=dev;
    16. return 0;
    17. }
    18. int light_release(struct inode *inode,struct file *filp)
    19. {
    20. return 0;
    21. }
    22. ssize_t light_read(struct file *filp,char _user *buf,siloff_t *f_pos)
    23. {
    24. struct light_dev *dev=filp->private_data;
    25. if(copy_to_user(buf,&(dev->value),1))
    26. return -EFAULT;
    27. return 1;
    28. ssize_t light_write(struct file *filp,char_user *buf,)

    总结

    我们只需要有一个感性认识,那就是,上述暂时陌生的元素都是Linux内核为字符设备定义的,以实现驱动与内核接口而定义的。Linux对各类设备的驱动都定义了类似的数据结构和函数。

     

  • 相关阅读:
    用4年8个月熬出头!成功入职阿里巴巴,涨薪14K(Java)
    mybatis4:动态sql
    【调试经验】MySQL - fatal error: mysql/mysql.h: 没有那个文件或目录
    面试官:熟悉Redis?请讲讲Redis缓存穿透、缓存击穿、缓存雪崩有什么区别
    知识付费平台开发技术实践:构建数字学习的未来
    iNeuOS工业互联网操作系统,增加2154个视图建模(WEB组态)行业矢量图元、大屏背景及相关图元
    计算机网络(自顶向下)—第四章测验题
    “唯品会VIP商品API:一键获取奢侈品详情,尊享品质生活!“
    2022牛客蔚来杯第二场 G J K L D C (H)
    51单片机实训项目之产品数量计数器
  • 原文地址:https://blog.csdn.net/whm128/article/details/134426807