USB ddk中例子代码的问题

各位好:
USB DDK 中keyb.c有段代码如下:

int keyb_io_open( resmgr_context_t *ctp, io_open_t *msg, RESMGR_HANDLE_T *handle, void *extra )
{
keyb_t *keyb;
int status;

keyb = (keyb_t *)handle;

}

请问handle为何可以转换成keyb_t?RESMGR_HANDLE_T不是io_funcs_t么?
keyb_io_read中的ocb->attr也有相同的转换。

另外,我想写一个sandisk u盘的驱动,写着玩,机器上现有的devu-umass已经可以驱动这个u盘了;请问除了实现open, read, write以外,还要实现io_funcs中的哪些函数呢?lseek?

谢谢!


Leslie

handle 是 resmgr_attach() 的最后一个参数。

一个resmgr,要实现哪些iofunc,取决于你想要支持到什么地步。

iofunc_func_init()实际上经把一批“标准”的iofunc挂上了。如果你的支持的操作,都是标准的POSIX IO,那么基本上的东西都有了。

谢谢xtang的回复。

在keyb.c中resmgr_attach的最后一个参数传入的是&keyb->attr,并没有传入keyb呀?这里还有些不明白。

“iofunc_func_init()实际上经把一批“标准”的iofunc挂上了。如果你的支持的操作,都是标准的POSIX IO,那么基本上的东西都有了。”

那我的u盘只需要mount,ls等等标准操作,那我是否都不用去override这些函数了呢?如何让标准函数知道使用哪个endpoint和urb呢?

thanks!

Leslie

啊,这个有点搞,从语言表述上来说,程序不是很好。

typedef struct {
iofunc_attr attr;

} keyb_t;

keyb_t keyb;

所以,&keyb->attr == &keyb。

“iofunc_func_init()实际上经把一批“标准”的iofunc挂上了。如果你的支持的操作,都是标准的POSIX IO,那么基本上的东西都有了。”

那我的u盘只需要mount,ls等等标准操作,那我是否都不用去override这些函数了呢?如何让标准函数知道使用哪个endpoint和urb呢?

不是。

比方说 ls /myusb,这个就涉及到了 opendir(); readdir(); stat(); 等一连串的io操作,这一连串的操作,总是需要你override一些函数,才会有“有意义”的结果返回。

我说的“标准”iofunc,你可以试试写一个仅只有 resmgr_attach()的resmgr,你会发现你也可以 ls 你 resmgr_attach() 里的路径名,你甚至也能够open()/read()/write() 它,虽然你什么函数都没有 override。但是显然,read()虽然成功,却没有有意义的数据;write()虽然也成功,write()进去的数据只是被扔了而已。

只有你override了适当的函数,resmgr才会变得有意义。