摘 要:基于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.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
virtex_devices.c 中的platform_device 是在系统启动时,使用virtex_init(void)函数进行注册。
同时被注册还有很多virtex 平台的设备,该函数是在系统初始化阶段调用,驱动注册时需要匹配内核中所有已注册的设备名,因此platform_device 设备的注册过程必须在相应设备驱动加载之前被调用。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)