ECos 驱动程序的编写 1/12 ECos系统驱动程序的编写 介绍 Ecos 的驱动程序分为两个部分: 1. /dev 目录下,该部分程序同硬件相关 2. /io 目录下,该部分程序同系统相关 在IO 包中的元件,可以增加 当一个驱动程序被认为是静止的时候,她们必须通过一个透明的“ handle”来访问。每一个设备都有一个独特的名字,函数 cyg_io_lookup()被用来寻找设备名字和设备号的对应。而且,cyg_io_lookup()函数为设备驱动程序在使用该设备时进行设备的初始化提供了方便。 所有设备都有一个名字,如:/dev/console、/dev/serial0,等等 所有的驱动程序,在Ecos 中都是有 c 写成的 设备驱动程序的基本功能是提供对设备的接收和发送数据。而详细的实现方法有设备类自己实现。例如:向块设备读写数据同向串口读写数据不同 附加的函数为操作设备或硬件设备的状态提供了接口。不同的设备有不同的附加函数。 Ecos 的设备模块支持分层(layering),也就是说,一个设备驱动程序可以创建在另一个设备驱动程序上。例如:tty 就建立在简单的串口驱动上。上层模块相对底层模块而言,有更好的可塑性,可以增加更多的功能和特征。如 tty设备驱动还提供了队列缓冲和编辑。 有些设备驱动还提供了它们所依赖的下一级驱动的特性。Tty设备允许通过get/set config调用来操作实际串口的的信息,并下达到实际串口。 用户 AP I 所有相关函数,除了 cyg_io_lookup()以外,都需要 io 句柄。 所有函数都返回一个Cyg_ErrNo 值。若一个错误发生时,该值为负数,且其绝对值代表相应的错误号。该值在cyg/error/codes.h 有定义。正确返回 ENOERR。任何的函数参数都为指针。它允许驱动传递效率高。最应引起注意的是参数 length,他将传递给读写函数。他包含有一个期待返回的数据长度而返回实际长度。 Cyg_ErrNo cyg_io_lookup( const char *name, cyg_io_handle_t *handle ) 上述函数将设备名字转换成句柄。若没有该设备,则返回 –ENOENT。若设备存在,则handle 中将包含正确的设备指针。 Cyg_ErrNo cyg_io_write( cyg_io_handle_t handle, const void *buf, cyg_uint32 *len ) 发送数据到设备,数据在buf 中,长度在LEN 的单元中。而实际发送的数据长度在LENECos 驱动程序的编写 2/12 中返回。 Cyg_ErrNo cyg_io_read( cyg_io_handle_t handle, void *buf, cyg_uint32 *len ) 读取数据。 Cyg_ErrNo cyg_io_get_...