eCos设备驱动程序 (一)

http://blog.chinaunix.net/uid-23860671-id-150538.html

  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请求进行处理。

原文地址:https://www.cnblogs.com/kuainiao/p/2957798.html