eCos设备驱动程序(一)
. 应用程序在使用设备的时候,它通过驱动程序的用户API访问设备驱动程序,而设备驱动程序通过设备内核API与内核和硬件抽象层HAL进行交互,设备驱动程序和内核再通过HAL对硬件平台进行操作,从而实现对设备的访问。
设备驱动程序一般可分为三个部分,分别为设备表入口DEVTAB_ENTRY、设备I/O函数表DEVIO_TAB和设备I/O函数。设备驱动程序的主要组成模块全部定义在头文件cyg/io/devtab.h中。
ecos中的所有设备驱动程序都使用设备表入口来进行描述。设备表入口是一个具有cyg_devtab_ebtry_t类型的数据结构,使用宏DEVTAB_ENTRY()可以生成一个设备表入口,其格式为:
DEVTAB_ENTRY(l,name,dep_name,handlers,init,lookup,priv)
其中:
l: 该设备表入口的"C"标识符。
name: 该设备的"C"字符串名字。
dep_name: 对于一个层次设备,些参娄是该设备的下层设备的"C"字符串名字。
handles: I/O函数句柄指针(见下面的设备I/O函数表DEVIO_TAB的详细说明)。
init: 当ecos处于初始化阶段时被调用的函数,该函数可以进行查找设备、对硬件进行设置等操作。
lookup: 当调用cyg_io_lookup()函数对该设备进行操作时所调用的一个函数。
priv: 该设备驱动程序所需要的专用数据存放位置。
上而所定义的设备表入口只适用于字符设备。对于块设备,要使用宏BLOCK_DEVTAB_ENTRY进行定义。其格式为:
BLOCK_DEVTAB_ENTRY(l,name,dep_name,handlers,init,lookup,priv)
设备表入口中的句柄handles提供了一级设备驱动程序接口函数。handlers是设备I/O函数表DEVIO_TAB的指针,DEVIO_TAB包
含了一组函数的指针,这些函数是各种接口函数cyg_io_XXX()的具体实现。设备I/O函数表通过DEVIO_TAB宏来定义,其格式如下:
DEVIO_TABLE(l,write,read,get_config,set_config)
其中:
l: 该表的"C"标识符。
write: cyg_io_write()函数所调用的函数,实现向设备传送数据。
read: cyg_io_read()函数所调用的函数,实现从设备读取数据。
get_config: cyg_io_get_config()函数所调用的函数,实现对设备配置信息的读取操作。
set_config: cyg_io_set_config()函数所调用的函数,完成对设备的配置操作。
在ecos的初始化引导过程中,对系统中的所有设备都要调用其相应的init()函数。init()函数有可能返回错误,出现这种情况时,设备将处于"离线"状态,所有针对离线设备的I/O请求都将返回错误。
当使用某个设备的名字调用cyg_io_lookup()函数时,该设备的设备表入口中指定的lookup()将被调用。lookup()函数将使设备处于"在线"状态,处于在线状态下的设备对所有针对该项设备的I/O请求进行处理。
阅读(2840) | 评论(0) | 转发(1) |