Xilinx设备的驱动程序

xilinx为所有设备都提供了standalone模式的驱动程序。xilinx sdk会根据硬件系统的配置情况,将使用的设备的驱动加入到创建的bsp工程中。
xilinx设备的驱动程序的存放路径是安装目录下的sw目录下。以vivado 2013.4, 驱动程序的相对路径是\sdk\2013.4\sw\xilinxprocessoriplib\drivers\。其中src目录存放驱动程序,examples目录存放了使用实例代码。
对于一个设备,驱动必须的硬件信息有设备的基地址,时钟、中段号等。xilinx的驱动程序还为每个设备分配了一个设备号。这些信息都是在xparameters_ps.h中定义的,一般使用如下的命名,mod_device_id, mod _baseaddr, mod _clock_hz, mod _intr, mod _int_id。xparameters_ps.h是由sdk自动根据硬件工程生成的。
xilinx的驱动程序主要有下列文件:mod.c, mod_g.c, mod_hw.c, mod_options.c, mod_selftest.c, mod_sinit.c, mod.h, mod_hw.h;有些驱动还有mod_intr.c。其中的mod代表具体的设备名称。
驱动程序中主要用到了两个数据结构,都定义在文件中mod.h。mod_config主要用于向驱动程序传递他需要的硬件信息。zynq的spi设备的硬件信息数据结构。
typedef struct {
u16 deviceid; /**< unique id of device */
u32 baseaddress; /**< base address of the device */
u32 inputclockhz; /**< input clock frequency */
} xspips_config;
另外一个数据结构是以模块名命名,含有驱动程序运行过程中需要的信息,比如是否就绪、是否忙等状态信息吗,甚至收发数据的缓冲区地址也可能有。zynq的spi设备的驱动程序数据结构。
typedef struct {
xspips_config config; /**< configuration structure */
u32 isready; /**< device is initialized and ready */
u8 *sendbufferptr; /**< buffer to send (state) */
u8 *recvbufferptr; /**< buffer to receive (state) */
unsigned requestedbytes; /**< number of bytes to transfer (state) */
unsigned remainingbytes; /**< number of bytes left to transfer(state) */
u32 isbusy; /**< a transfer is in progress (state) */
u32 slaveselect; /**< the slave select value when
xspips_force_sselect_option is set */
xspips_statushandler statushandler;
void *statusref; /**< callback reference for status handler */
} xspips;
mod_g.c主要定义一个全局变量,向驱动程序提供设备的硬件信息。比如zynq的spi设备的xspips_g.c文件主要是下列变量定义。其中的宏,都是在xparameters_ps.h定义的。这个文件是由sdk自动根据硬件工程生成的。
xspips_config xspips_configtable[xpar_xspips_num_instances] = {
{
xpar_xspips_0_device_id, /* device id for instance */
xpar_xspips_0_baseaddr, /* device base address */
xpar_xspips_0_clock_hz
},
{
xpar_xspips_1_device_id, /* device id for instance */
xpar_xspips_1_baseaddr, /* device base address */
xpar_xspips_1_clock_hz
}
};
mod_sinit.c完成设备硬件信息的初始化工作。它其中有一个xspips_lookupconfig()函数,根据设备号,查找对应的硬件信息。这样驱动程序的大部分代码可以支持多个设备。zynq的spi设备的设备硬件初始化函数:
xspips_config *xspips_lookupconfig(u16 deviceid)
{
xspips_config *cfgptr = null;
int index;
for (index = 0; index < xpar_xspips_num_instances; index++) {
if (xspips_configtable[index].deviceid == deviceid) {
cfgptr = &xspips_configtable[index];
break;
}
}
return cfgptr;
}
mod_hw.h主要用来定义硬件寄存器信息,如偏移地址、寄存器的各位的功能。另外它还附带有主要寄存器操作的宏的实现。
mod_hw.c主要用来实现设备的复位函数。另外一些底层的函数,如果与中断等无关,也可能放在这里,比如串口设备的收发函数,就在这个文件中。这个文件一般很小,函数很少。
mod_selftest.c用来实现自测函数。
mod_intr.c用来实现与中断相关的函数。可以参考xuartps_intr.c。
驱动程序的对外接口都在mod.c中实现。其它没有专门文件存放的函数,一般也放在这个文件中。初始化用的mod_cfginitialize( )也是在这个函数中实现。其它常见的收发函数等一般也放在这个文件中。mod.h中实现其它模块可能使用的宏,并声明mod.c中实现的函数。
所有设备的驱动程序使用方法类似。第一步是用设备id调用mod_lookupconfig( ), 查询设备信息。第二步是使用设备信息调用mod_cfginitialize( ),初始化设备,一般会设置默认工作状态。这一步后,设备硬件就应该进入就绪状态。第三步是调用mod_selftest(), 对设备做一下自检。这三步一般都需要完成。接下来可以最设备做一些设备相关的设置,比如设置串口的波特率等。然后设备就进入工作状态,可以进行正常服务。
有些客户用到了linux。standalone模式是没有操作系统的场景。但是如果把设备的地址空间映射到用户空间,standalone模式的驱动程序也可以直接作为linux 用户空间的驱动程序。具体代码,可以参考ug873操作cdma设备的代码。这时没有sdk自动生成的xparameters_ps.h文件。用户需要自己创建一个头文件,提供mod_g.c需要的基地址,时钟、中段号等硬件信息。

从服务器发展方向来分析CPU的发展趋势
iPhone 5有没有可能双屏
tcp ip协议_什么是tcp ip协议
智能手机防水是如何实现的
关于自动生成高效的代码的方法分析和分享
Xilinx设备的驱动程序
乐视东山再起可能性微乎其微,小米持续崛起的后劲令人生畏
2021年中国智能制造如何理性前行?
消息称小米 11 有望搭载屏下摄像头技术,明年 3 月开卖
LED风潮带动 背光模组今年产量再跃进约14.5%
LED照明驱动ic U6117SA和U6117SG输出功率的具体区别是什么?
特斯拉再次在北美把充电柱密度提高,网友:中国市场是不是要彻底放弃了?
Semtech的LoRa技术为改善中国设施管理创建表计解决方案
C语言的基本知识、特征和面向对象详解
五个降低UPS电源总故障率的好方法
这款i.MX6ULL核心板如何为水质把关?—— 飞凌方案
零知识证明将如何重新定义区块链的运作方式
触摸开关工作原理
全部售罄!这款搭载新一代散热技术的主机究竟有何魅力?
基于区块链游戏存在的问题,听专家有何见解