Rtems--c_user--IO管理器

 

写在前面的话:初学Rtems,英语水平也有限,错误在所难免,请各位大牛不吝赐教,完善c_user的翻译。便于大家受益,在此谢过!

 

16.1引言

输入输出接口管理器提供了一个机制。该机制提供了如何调用已有的设备驱动和自己创建设备驱动的方法。I/O管理器提供的函数有:

 rtems_io_initialize -- Initialize a device driver
 rtems_io_register_driver -- Register a device driver
 rtems_io_unregister_driver -- Unregister a device driver
 rtems_io_register_name -- Register a device name
 rtems_io_lookup_name -- Look up a device name
 rtems_io_open -- Open a device
 rtems_io_close -- Close a device
 rtems_io_read -- Read from a device
 rtems_io_write -- Write to a device
 rtems_io_control -- Special device services

 

16.2背景

16.2.1驱动程序表

每个利用Rtems I/O 管理器的应用都必须在配置表中给出设备驱动程序表的地址。这张表包含了每个设备驱动的入口地址。由Rtems在做初始化时完成该初始化工作。每个驱动可能包含如下入口地址:

 Initialization
 Open
 Close
 Read
 Write
 Control

如果设备驱动不支持某个入口地址。那么他在配置表中用NULL替代。Rtems将会返回RTEMS_SUCCESSFUL作为...

 

应用程序可以注册也可以不注册这些驱动程序。这样,Rtems I/O 管理器避免了将所有的静态定义的设备驱动程序都链接到这张表中。

 

confdefs.h文件中的CONFIGURE_MAXIMUM_DRIVERS选项配置了应用程序中可以用的驱动的数量。

 

16.2.2 主设备号、次设备号

每个对I/O 管理器的调用都必须提供主设备号和次设备号作为参数。主设备号表示请求驱动的设备在设备在驱动表中的索引,用来选择与物理设备对应的设备驱动。次设备号的应用是由驱动程序定的,但常常用来区分多个同种设备中的具体设备。

 

数据类型rtems_device_major_number和rtems_device_minor_number分别用来定义主、次设备号。

 

16.2.3设备名

I/O 管理器提供了一个功能,可以将设备名和设备联系上。系统提供了注册设备名的函数、查询和设备名匹配的主、次设备号。

 

16.2.4 设备驱动环境

应用程序开发者和设备驱动程序开发者一样,关于Rtems I/O 管理器,必须意识到下面几点:

 

设备驱动程序的执行是在调用它的任务中完成,因此,如果驱动程序被阻塞,调用它的任务也将被阻塞。

设备驱动可以自由的改变调用他的任务的模式,尽管驱动必须恢复他们至原始的值。

设备驱动可能从中断中被调用。

只有本地设备驱动才能通过I/O 管理器获得。

一个设备驱动可能调用其他所有的Rtems函数,包括I/O函数,局部的和全局的对象。

 

尽管Rtems I/O 管理器提供设备驱动程序的框架。但是,没有关于设备驱动程序的结构和操作。

 

16.2.5 驱动的动态注册

BSP的开发和应用开发都可以,让一个设备驱动是静态的加入设备表还是动态注册。

动态注册驱动在下面的情况下对应用开发有帮组:

...

 

16.2.5 设备驱动接口

当应用程序调用一个I/O 管理器函数,Rtems将决定从哪个设备入口进入。由应用程序传递给Rtems的信息,这时传到了正确的设备入口。Rtems将调用各设备驱动入口,假定入口和下面的原型兼容。

rtems_device_driver io_entry(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *argument_block
);

参数部分的格式和内容为设备驱动相关的入口。这里推荐避免产生和应用组件相冲突的错误代码。一个通用的产生驱动特有的错误代码的方法是...

 

16.2.7设备驱动初始化

当多任务通过rtems_initialize_executive函数起来的时候,Rtems自动的初始化所有的设备驱动。Rtems是通过调用设备驱动的初始化入口函数来初始化驱动程序。入口函数有一下几个参数:

major 驱动的主设备号

minor 0
argument_block 将指向配置表

表返回的状态值将会被Rtems忽略。如果驱动不能成功的初始化设备,这是他必须调用 fatal error occurred 函数。

 

16.3操作 

16.3.1注册和查询设备名

rtems_io_register将设备名和具体的设备联系起来(如,主、次设备号)。通常用设备名注册,并将其作为设备初始化序列的一部分。rtems_io_lookup用来将设备名和主、次设备号联系起来。这些函数的作用将应用程序从依赖在特定程序中分配的任意的主设备号中解放出来。没有设备名的约定是由Rtems支配。

 

16.3.2获取驱动

I/O 管理器提供了一些函数使得应用程序可以以一种标准的方式来利用设备驱动。Rtems的I/O 管理函数rtems_io_initialize, rtems_io_open, rtems_io_close, rtems_io_read, rtems_io_write, and rtems_io_control 和相关的设备驱动函数直接关联。

 

16.4函数

这一部分详细列出了I/O 管理器的函数。下面这部分专门用来讲解I/O管理的函数、函数调用顺序、相关的变量、用法和状态代码。

16.4.1 IO_REGISTER_DRIVER - 注册一个设备驱动

调用序列:

rtems_status_code rtems_io_register_driver(
rtems_device_major_number major,
rtems_driver_address_table *driver_table,
rtems_device_major_number *registered_major
);

 

函数状态码:

RTEMS_SUCCESSFUL - 成功注册

RTEMS_INVALID_ADDRESS - 注册的主设备指针无效

RTEMS_INVALID_ADDRESS - 驱动表无效

RTEMS_INVALID_NUMBER - 主设备号无效

RTEMS_TOO_MANY - 没有可用的主设备表空间

RTEMS_RESOURCE_IN_USE - 主设备号入口正在使用

 

描述:

该函数的功能是尝试在设备驱动表中增加新设备驱动。用户可以利用函数major参数来设置设备的主设备号。或者通过在参数位置填充0,让注册程序自己寻找可以利用的主设备号。选定的主设备号通过参数registered_major_directive返回。如果让函数自动分配主设备号,那么将注册程序将选择从高到低的数值来分配。

如果驱动地址表中有初始化和打开的入口,那么函数将自动调用IO_INITIALIZE 函数。

如果驱动程序表太满,函数将返回RTEMS_TOO_MANY。如果主设备号已经被申请过或者正在使用中,那么函数将返回RTEMS_RESOURCE_IN_USE。

 

注意:

设备驱动表的尺寸是在配置表中进行配置的。这一项需要设置成应用程序需求的最大尺寸。

 

16.4.2 IO_UNREGISTER_DRIVER - 注销一个设备驱动

调用序列:

rtems_status_code rtems_io_unregister_driver(
rtems_device_major_number major
);

 

函数状态码:

RTEMS_SUCCESSFUL - 注销设备成功
RTEMS_INVALID_NUMBER - 主设备号无效

 

描述:

函数将一个设备驱动从设备驱动表中移除。

 

注意:

当前没有做具体的检查,设备没有关闭。

 

16.4.3 IO_INITIALIZE - 初始化设备

调用序列:

rtems_status_code rtems_io_initialize(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *argument
);

 

函数状态码:

RTEMS_SUCCESSFUL - 初始化设备成功
RTEMS_INVALID_NUMBER - 主设备号无效

描述:

函数调用的设备初始化程序由设备驱动表中相应主设备号所对应的驱动给定。当多任务通过initialize_executive函数初始化时,函数会自动调用各设备驱动。

一个设备驱动初始化模块负责初始化所有的硬件及与设备相关的数据结构。如果有必要,它还会为其他操作分配必要的内存。

 

注意:

该函数可能会或可能不会导致调用任务是抢占的。这是依赖于设备驱动程序初始化。

 

16.4.4 IO_REGISTER_NAME

rtems_status_code rtems_io_register_name(
const char *name,
rtems_device_major_number major,
rtems_device_minor_number minor
);

 

函数状态码:

RTEMS_SUCCESSFUL - 初始化设备成功
RTEMS_TOO_MANY - 注册的设备过多

 

描述:

该函数的作用是将设备名和特定的主、次设备号对映射起来。

 

注意:

该函数不会导致调用任务是抢占的。

 

16.4.5 IO_LOOKUP_NAME - 查询设备 

调用序列:

rtems_status_code rtems_io_lookup_name(
const char *name,
rtems_driver_name_t *device_info
);

 

函数状态码:

RTEMS_SUCCESSFUL - 初始化设备成功
RTEMS_UNSATISFIED - 注册的设备过多

 

描述:

函数将返回一个device_info中给定的设备名相对应的主、次设备号。

 

注意:

该函数不会导致调用任务是抢占的。

 

16.4.6 IO_OPEN - 打开设备

调用序列:

rtems_status_code rtems_io_open(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *argument
); 

 

函数状态码:

RTEMS_SUCCESSFUL - 初始化设备成功
RTEMS_INVALID_NUMBER - 主设备号无效

 

描述:

函数调用的设备打开程序,由设备驱动表中相应主设备号所对应的驱动提供。打开操作入口由设备驱动程序调用,该函数是唯一获取设备的方式。

 

注意:

该函数可能会或可能不会导致调用任务是抢占的。这是依赖于设备驱动程序初始化。

 

16.4.7 IO_CLOSE - 关闭设备

调用系列:

rtems_status_code rtems_io_close(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *argument
);

 

函数状态码:

RTEMS_SUCCESSFUL - 初始化设备成功
RTEMS_INVALID_NUMBER - 主设备号无效

 

描述:

函数调用的设备关闭程序,由设备驱动表中相应主设备号所对应的驱动提供。关闭操作入口由设备驱动程序调用,该函数是唯一释放设备的方式。

 

注意:

该函数可能会或可能不会导致调用任务是抢占的。这是依赖于设备驱动程序初始化。

 

16.4.8 IO_READ - 从设备读取数据

调用系列:

rtems_status_code rtems_io_read(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *argument
);

 

函数状态码:

RTEMS_SUCCESSFUL - 初始化设备成功
RTEMS_INVALID_NUMBER - 主设备号无效

 

描述:

函数调用的设备读数据程序,由设备驱动表中相应主设备号所对应的驱动提供。读操作需要一个缓存区地址作为参数的一部分。缓存区的内容将会被来自设备的数据所取代。

 

注意:

该函数可能会或可能不会导致调用任务是抢占的。这是依赖于设备驱动程序初始化。

 

16.4.9 IO_WRITE - 从设备写入数据

调用系列:

rtems_status_code rtems_io_write(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *argument
);

 

函数状态码:

RTEMS_SUCCESSFUL - 初始化设备成功
RTEMS_INVALID_NUMBER - 主设备号无效

 

描述:

函数调用的设备写数据程序,由设备驱动表中相应主设备号所对应的驱动提供。写操作需要一个缓存区地址作为参数的一部分。缓存区的内容将会被发送到选定的设备中。

 

注意:

该函数可能会或可能不会导致调用任务是抢占的。这是依赖于设备驱动程序初始化。

 

16.4.10 IO_CONTROL - 设备特殊操作

调用序列:

rtems_status_code rtems_io_control(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *argument
); 

 

函数状态码:

RTEMS_SUCCESSFUL - 初始化设备成功
RTEMS_INVALID_NUMBER - 主设备号无效

 

描述:

函数调用的设备I/O程序,由设备驱动表中相应主设备号所对应的驱动提供。由函数调用的驱动入口的额外功能是依赖各个驱动。不要认为两个设备驱动的控制入口函数是兼容的。 比如,一个RS-232驱动I/O控制操作可能是用来改变波特率的,而软驱的I/O控制操作肯是用去做搜寻操作的。

 

注意:

该函数可能会或可能不会导致调用任务是抢占的。这是依赖于设备驱动程序初始化。

(转载请注明出处)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值