rtems驱动的组织

rtems中的设备,可以抽象成设备文件一样访问(例如/dev/ttyS0),也可以通过I/O manager来访问

 

设备文件的major和minor

major

核心的数据结构是 _IO_Driver_address_table ,  是一个结构体rtems_driver_address_table的数组(定义在cpukit/sapi/include/confdefs.h中),设备文件的major,其实就是对应驱动在数组中的下标,结构体的定义如下:

cpukit/sapi/include/rtems/io.h

typedef struct {
  rtems_device_driver_entry initialization_entry;
  rtems_device_driver_entry open_entry;
  rtems_device_driver_entry close_entry;
  rtems_device_driver_entry read_entry;
  rtems_device_driver_entry write_entry;
  rtems_device_driver_entry control_entry;
} rtems_driver_address_table;

 除了initialization_entry外,其余五个函数指针与文件的五种操作一一对应(open close ioctl read write)。

initialization_entry在启动时调用(boot_card --> rtems_initialize_device_drivers  -->  _IO_Initialize_all_drivers  -->  rtems_io_initialize  --> initialization_entry )

这一层的函数在cpukit/sapi/src目录下的

io.c ioclose.c iocontrol.c ioinitialize.c ioopen.c ioread.c  iowrite.c  ioregisterdriver.c  iounregisterdriver.c  这几个文件中实现的。

 

minor

minor指的是一类设备中的其中一个设备,minor 为0和minor为1的设备可以是相同的驱动,也可以是不同的驱动。笔者将结合console驱动来对minor做说明,对于来说,

Console_Port_Tbl和Console_Port_Data是核心数据结构,Console_Port_Tbl可以看作一个指针数组

c/src/lib/libbsp/shared/console.c

console_tbl               **Console_Port_Tbl    = NULL;


其中,console_tbl的定义如下:

c/src/libchip/serial/serial.h

typedef struct _console_tbl {
...
  const console_fns *pDeviceFns;
...
  unsigned int   ulIntVector;
...
} console_tbl;

 

 在console_open函数中

rtems_device_driver console_open(
  rtems_device_major_number major,
  rtems_device_minor_number minor,
  void                    * arg
)
{
...
  cptr = Console_Port_Tbl[minor];
  Callbacks.firstOpen            = cptr->pDeviceFns->deviceFirstOpen;
...
}


这里的minor,其实就是Console_Port_Tbl的下标索引,用minor可以找到具体某一设备的驱动

Console_Port_Tbl、Console_Port_Data是全局变量,但只是在console及具体的串口驱动中应用,为每个设备提供所需要的私有数据,对Major那一层来说是不知道这两个全局变量的存在的。

minor有用么?

当然,对于只有一个的一类设备,minor是没什么意义,比如对于tick的驱动程序来说,一个就够了(两个就乱套了吧,  ^_^)

cpukit/libcsupport/include/clockdrv.h

#define CLOCK_DRIVER_TABLE_ENTRY \
  { Clock_initialize, NULL, NULL, NULL, NULL, NULL }

除了initialization_entry外,其他都不支持,它是不支持minor的,minor对它来说也是无意义的。

 

 如何关联到文件

调用函数rtems_io_register_name(const char * name,  major, minor), 这样把一个设备的(major, minor)号关联到一个文件上去, 这个函数一般在minor那一层初始化时做,因为在那时,才能确定下来minor号码是多少

目前支持的设备

console

clock

rtc

watchdog

/dev/null

/dev/zero

IDE

ATA

FrameBuffer等

另外,应用程序也可定义额外的驱动

 

遗留问题

网络的驱动,应该不是这种方式实现的

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值