怎么写一个硬件驱动程序?
电子/通信
0 1157
2
该提问暂无详细描述
收藏
2021-01-26 04:33 更新 我爱喝牛奶G •  1972
共 1 个回答
高赞 时间
0

简而言之,这写起来并不容易。但这是我所做的一部分,我乐于接受挑战。

必须区分两种情况:编写驱动程序作为微控制器体系结构的一部分,将其变成刻录到闪存中的程序的一部分,或者编写用于Windows,Linux或Mac OS等操作系统的可安装或可加载的设备驱动程序。我所经历的大部分都是前者的经历。我为Linux编写了较少的可加载驱动程序,但这是几年前的事。为Windows之类的操作系统编写驱动程序需要付出额外的努力,因为除了编写实际的驱动程序之外,你还必须编写代码以允许其安装/卸载等。

内部外围设备的硬件驱动程序

有用于微控制器硬件组件的驱动程序,例如编写嵌入式外围设备,例如I2C,SPI,UART,USB,DMA,I2S,ADC,DAC等。至少需要能够阅读和理解数百页甚至数千页长的微处理器或微控制器的数据表。为了测试你的驱动程序,应该能够读取原理图(因为你可能会探测开发板的信号),使用示波器,万用表和其他测试设备。成为一名EE(电气工程师)或至少在电子方面具有扎实的基础是有帮助的。

最近,我刚刚为ARM Cortex-M7处理器编写了I2S(IC间声音)驱动程序。因此,我不仅必须非常熟悉I2S协议,而且还必须熟悉处理器中SSC和I2SC外设的所有寄存器设置,这些寄存器生成I2S协议的时钟和数据部分,在2200页的70页中涵盖处理器的“datasheet”。诸如此类的事情可能要花费几周甚至更长的时间,特别是如果从头开始工作并且必须设计API(应用程序编程接口)。

尽管大多数API遵循相同的模式,但具有以下功能:

  • DRV_XYZ_Open —打开驱动程序;返回一个句柄
  • DRV_XYZ_Close —关闭驱动程序
  • DRV_XYX_Initialize —初始化驱动程序
  • DRV_XYZ_Tasks —运行驱动程序的状态机
  • DRV_XYZ_Status —驱动程序的返回状态

对于使用DMA输入/输出的硬件,以下API可能可用:

  • DRV_XYZ_BufferAddWrite —将缓冲区添加到DMA写队列
  • DRV_XYZ_BufferAddRead —将缓冲区添加到DMA读取队列
  • DRV_XYZ_BufferAddWriteRead —将缓冲区添加到DMA r / w队列
  • DRV_XYZ_BufferEventHandlerSet —注册一个回调函数
  • DRV_XYZ_WriteQueuePurge —清除外设的DMA写队列
  • DRV_XYZ_ReadQueuePurge —清除外设的DMA读取队列

虽然最困难的部分通常不是编码API部分,而是编码驱动程序的初始配置,这可以通过调用DRV_XYZ_Initialize函数以及可能指向配置参数表的指针来完成。

微控制器中的硬件外设可以具有十几个寄存器。这是控制此处理器中用于I2S的SSC(同步串行控制器)的18个寄存器之一:

main-qimg-aec1fe2bd01d3cea2ac62c85e5304660

可能需要创建一个GUI才能将其配置为框架的一部分。这是我创建的(用Python编码)。如果选择标准的I2S格式,我将选择保持简单:

main-qimg-c2bfad41128485f51c2cf4b2f20c9366

但是,如果选择“音频协议模式”作为“自定义”,则几乎公开了所有配置寄存器设置:

main-qimg-1aed784101fb1708bd03aaf570fca2f9

大多数设置都有几个选项。填充所有默认值的方式与在先前菜单中选择适当的选项(例如,从设备,I2S和数据长度)相同。提供更简单的菜单使大多数应用程序程序员不必学习I2S的详细信息。

外围设备的硬件驱动程序

另一种类型的硬件驱动程序用于连接到微控制器的外围设备,通常使用上述串行接口之一。例如,音频编解码器可能使用I2C和I2S。或可能使用UART和I2S的蓝牙驱动程序。在这种情况下,你需要研究特定设备的数据表。例如,WM8904编解码器的这一页长184页。它具有近100个内部寄存器。因此,你必须了解如何配置和使用它们,以及如何使用I2S和I2C。也将为这些创建GUI进行初始化。

除了前面显示的API调用之外,编解码器通常还具有以下功能:设置或获取采样率,设置或获取音量和麦克风增益,以及为麦克风和输出静音开/关。蓝牙模块将具有自己的一组专用API,具体取决于所使用的协议。

本回答来自Tom Crosley, Embedded systems programmer for over 40 years

收藏
2021-01-26 04:34 更新 蝈蝈 •  220