根据参考,我自己写了一个驱动 .c和 .h
但是编译时遇到了如下问题:
undefined reference to ‘usbd_attach’ 等等
也就是说所有系统应该提供的 usb 操作函数都找不到实体。
追查头文件,发现这些函数都是在 usbdi.h 里面声明的,但是却找不到函数实体。
这是怎么一回事?该如何解决呢?
还有一个问题。
在 callback sen_insertion() 里面通过调用 sen_resmgr_attach() 函数,
注册了对设备进行操作的若干函数,如 sen_io_open, sen_io_read 等等。
这样,在本驱动程序加载后,该如何对USB设备进行读写操作呢?
是向普通文件一样直接操作USB设备么?具体是怎样的呢?
例如, sen_io_read() 如下:
int sensor_io_read( resmgr_context_t *ctp, io_read_t *msg, RESMGR_OCB_T *ocb )
需要返回得到的数据的地址和长度等信息。
谢谢
如下:
// signal handler
void sen_signal_handler( )
{
siginfo_t info;
sigset_t set;
sen_t *sen;
sen_t *nsen;
// set signals to 0xFFFFFFFF, no signals to resmgr threads
sigfillset( &set );
sigdelset( &set, SIGTERM );
// examine and change blocked signals
sigprocmask( SIG_BLOCK, &set, NULL );
// initialize set to no signals
sigemptyset( &set );
// add signal to set
// SIGTERM: the macro yields the sig argument value for the asynchronous termination request signal
sigaddset( &set, SIGTERM );
// select the pending signal from set or block itself if no signal in set is pending at the time of the call
// return -1 if an error occurs
while( SignalWaitinfo( &set, &info ) == -1 )
;
// free resources hold by sen
for( sen = TAILQ_FIRST( &SenCtrl.dlist ); sen; sen = nsen ) {
nsen = TAILQ_NEXT( sen, dlink );
sen_free( sen );
}
}
// callback in bulk mode
void sen_bulk_cbf( struct usbd_urb *urb, struct usbd_pipe *pipe, void *hdl )
{
pipe = pipe, hdl = hdl;
pthread_sleepon_lock( );
pthread_sleepon_signal( urb );
pthread_sleepon_unlock( );
return;
}
都有什么作用呢?。。。
(注释是我自己写的,但是函数的作用不明白。。。)
在工程的特性设置里,linker->extra libraries连接上libusbdi.so就可以了。
问题解决了。。。
之前我把问题想的过于复杂,实际很简单的。
驱动把USB设备注册到了资源管理器,可以对设备使用普通的操作函数,如 open,write,read等。