您现在的位置: 主页 > 嵌入式处理器 > FPGA > 基于FPGA嵌入式系统的设备驱动开发 - FPGA/ASIC技术 -
本文所属标签:
为本文创立个标签吧:

基于FPGA嵌入式系统的设备驱动开发 - FPGA/ASIC技术 -

来源: 网络用户发布,如有版权联系网管删除 2018-08-11 

摘 要:基于FPGA 嵌入式系统,在PowerPC 架构的Linux2.6 操作系统环境下,对通用输入输出接口(GPIO)控制器的驱动,采用平台设备机制进行中断控制管理。通过该管理机制,将GPIO 设备本身的资源注册进内核,由内核统一管理。在参照Linux2.6 内核源码有关平台设备驱动的基础上,编写和测试了GPIO 设备的驱动程序。该驱动程序已在Xilinx 公司FPGA 开发板ML403 上验证,并且稳定运行。

从Linux 2.6 起引入了平台设备机制,即platform device driver 机制,Linux 中大部分设备驱动都可以使用这套机制[1]。和传统的device driver 机制(通过driverregister 函数进行注册)相比,十分明显的优势在于platform 机制将设备本身的资源注册进内核,由内核统一管理,在驱动程序中使用这些资源时通过platform device 提供的标准接口进行申请并使用[2]。这样提高了驱动和资源管理的独立性,并且拥有较好的可移植性和安全性。文中讨论的GPIO 设备具有双重身份:平台设备与混杂设备(miscdevice)。平台设备意味着GPIO控制器设备是属于平台的独立模块;混杂设备(即主设备号为10)是一种特殊的字符型设备,描述了GPIO 控制器的访问方式是顺序的[1]。

1 Linux中平台设备驱动开发流程

ML403 开发板采用vertex-4 系列FPGA,集成了PowerPC405 硬核,带有内核管理单元(MMU),因此可以在该开发板上运行Linux2.6 操作系统。在嵌入式Linux2.6 操作系统中,通过Platform 机制,对外设进行管理。开发设备驱动的流程如图1 所示:

图1 Platform 机制开发设备驱动流程图

1.1 定义platform_device

在Linux 2.6 内核中platform 设备用结构体platform_device 来描述, 该结构体定义在kernel\include\linux\platform_device.h 中:
struct platform_device {
const char * name; //平台设备的设备名
u32 id; //平台设备的设备ID
struct device dev; //设备结构体
u32 num_resources; //平台设备使用的各类资源数

struct resource * resource; //资源
};

该结构一个重要的元素是resource,它存入了最为重要的设备资源信息。在嵌入式开发工具EDK 中生成BSP( 板级支持包)的时候有一个设备参数头文件xparameter.h,里面定义了相关设备的设备数量、地址资源、中断资源和时钟资源等。在添加平台设备信息的时候需要用到该头文件中定义的地址信息和中断信息,Xilinx 公司的Virtex-4 平台设备是kernel/arch/ppc/syslib/virtex_devices.c 中定义的,在编写驱动之前,需要在该文件中添加有关GPIO 控制器的设备定义:
/*
* ML300/ML403 Gpio Device: shortcut macro for single instance
*/
#define XPAR_GPIO(num) { \
.name = "xilinx_gpio", \
.id = num, \
.dev.platform_data=XPAR_GPIO_##num##
_IS_DUAL, \
.num_resources = 2, \
.resource = (struct resource[]) { \
{ \
.start=XPAR_GPIO_##num##_B
ASEADDR, \

.end=XPAR_GPIO_##num##_HI
GHADDR, \
.flags = IORESOURCE_MEM, \
}, \
{ \
.start=XPAR_INTC_0_GPIO_##n
um##_VEC_ID, \
.flags = IORESOURCE_IRQ, \
}, \
}, \
}
/* GPIO instances */
#if defined(XPAR_GPIO_0_BASEADDR)
XPAR_GPIO(0),
#endif
#if defined(XPAR_GPIO_1_BASEADDR)
XPAR_GPIO(1),
#endif
#if defined(XPAR_GPIO_2_BASEADDR)
XPAR_GPIO(2),
#endif

上述的代码定义了GPIO 设备名称——xilinx_gpio,XPAR_GPIO 平台设备结构中name 元素和设备驱动的platform_driver 结构体中的driver.name 必须是相同的。这是因为在平台设备驱动注册时会对所有已注册的platform_device 中的name 和当前注册的platform_driver 的driver.name 进行比较, 使得platfrom_device 和platform_driver 建立关联,只有找到相同的名称的platfomr_device 才能注册成功。在平台设备的描述中GPIO 设备定义了2 个资源,一个是I/O空间资源,描述了GPIO 控制器设备所占用的总线地址范围,IORESOURCE_MEM 表示第1 组描述的是内存类型的资源信息;另一个是中断资源,描述了设备的中断号,IORESOURCE_IRQ 表示第2 组描述的是中断资源信息,设备驱动会根据类型来获取相应的资源信息。本文共用到三个GPIO 设备XPAR_GPIO(0),XPAR_GPIO(1),XPAR_GPIO(2)。

1.2 注册platform_device

virtex_devices.c 中的platform_device 是在系统启动时,使用virtex_init(void)函数进行注册。

同时被注册还有很多virtex 平台的设备,该函数是在系统初始化阶段调用,驱动注册时需要匹配内核中所有已注册的设备名,因此platform_device 设备的注册过程必须在相应设备驱动加载之前被调用。


              查看评论 回复



嵌入式交流网主页 > 嵌入式处理器 > FPGA > 基于FPGA嵌入式系统的设备驱动开发 - FPGA/ASIC技术 -
 

"基于FPGA嵌入式系统的设备驱动开发 - FPGA/ASIC技术 -"的相关文章

网站地图

围观()