Chinaunix首页 | 论坛 | 博客
  • 博客访问: 863360
  • 博文数量: 149
  • 博客积分: 3671
  • 博客等级: 中校
  • 技术积分: 1701
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-03 16:52
文章分类

全部博文(149)

文章存档

2011年(57)

2010年(92)

分类: 嵌入式

2010-08-17 19:16:12

      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请求进行处理。
阅读(2798) | 评论(0) | 转发(1) |
0

上一篇:烧写redboot

下一篇:eCos设备驱动程序(二)

给主人留下些什么吧!~~