本人也是刚刚开始去尝试qnx的驱动(基于am437x)。
在QNX下开发驱动程序,最主要的工作除了了解底层硬件具体工作流程外,就是建立一个能与操作系统兼容且支持POSIX的Resource manger框架了。在任何一段程序的执行过程中一段都是从main函数开始的,然而在操作系统中的main函数还传递了两个参数:int argc, char **argv,这两个参数是用来传递从shell命令行或者buildfile中传来对Resource manger具体参数的,使用options (int argc, char **argv);函数实现,所以这个函数在main函数中最开始的位置,可以开发的driver具有不同可选的特性,提供使用的便利性。
第一步:书写options (int argc, char **argv);的具体实现;
第二步:建立一个上下文切换句柄dpp = dispatch_create ();这个东东主要用在mainloop中产生一个block特性,可以让我们等待接受消息;
第三步:iofunc初始化。这一步是将自己实现的函数与POSIX层函数进行接口,解析从read、write、devctl等函数传来的消息进行解析,以实现底层与应用层函数之间的交互,通过io_funcs.read = io_read,io_funcs.write = io_write,进行函数重载;
第四步:注册设备名,使设备在命名空间中产生相应的名称,这一点是整个过程的关键了,形如 pathID = resmgr_attach (dpp, &rattr, "/dev/Null",_FTYPE_ANY, 0, &connect_funcs, &io_funcs, &ioattr),这样不仅注册了一个设备名,还让系统知道了我们实习的IO函数对应关系;
第五步:为之前创建的上下文句柄分配空间,例如ctp = dispatch_context_alloc (dpp);为了第六步使用;
第六步:通过不断循环等待dispatch_block()来调用MsgReceive()使Resource manger处于receive block状态,以接收上层发送来的消息,通过dispatch_handler (ctp)去调用我们自己定义的IO函数。
这样一个single thread设备驱动dev/Null就创建好了,是不是很简单。
在QNX下开发驱动程序,最主要的工作除了了解底层硬件具体工作流程外,就是建立一个能与操作系统兼容且支持POSIX的Resource manger框架了。在任何一段程序的执行过程中一段都是从main函数开始的,然而在操作系统中的main函数还传递了两个参数:int argc, char **argv,这两个参数是用来传递从shell命令行或者buildfile中传来对Resource manger具体参数的,使用options (int argc, char **argv);函数实现,所以这个函数在main函数中最开始的位置,可以开发的driver具有不同可选的特性,提供使用的便利性。
第一步:书写options (int argc, char **argv);的具体实现;
第二步:建立一个上下文切换句柄dpp = dispatch_create ();这个东东主要用在mainloop中产生一个block特性,可以让我们等待接受消息;
第三步:iofunc初始化。这一步是将自己实现的函数与POSIX层函数进行接口,解析从read、write、devctl等函数传来的消息进行解析,以实现底层与应用层函数之间的交互,通过io_funcs.read = io_read,io_funcs.write = io_write,进行函数重载;
第四步:注册设备名,使设备在命名空间中产生相应的名称,这一点是整个过程的关键了,形如 pathID = resmgr_attach (dpp, &rattr, "/dev/Null",_FTYPE_ANY, 0, &connect_funcs, &io_funcs, &ioattr),这样不仅注册了一个设备名,还让系统知道了我们实习的IO函数对应关系;
第五步:为之前创建的上下文句柄分配空间,例如ctp = dispatch_context_alloc (dpp);为了第六步使用;
第六步:通过不断循环等待dispatch_block()来调用MsgReceive()使Resource manger处于receive block状态,以接收上层发送来的消息,通过dispatch_handler (ctp)去调用我们自己定义的IO函数。
这样一个single thread设备驱动dev/Null就创建好了,是不是很简单。