当插上一些在ARM上的摄像头,系统崩溃.这是因为我们分配缓冲一个URB通过usb_buffer_alloc,分配的缓冲区已经在DMA连贯的区域,因此,我们应该设置标志这个urb到URB_NO_TRANSFER_DMA_MAP,否则当我们提交这个urb,HCD核心处理这个地址作为非DMA地址和呼叫dma_map_single / SG映射。 在ARM架构上,dma_map_single连贯的一个DMA地址将被一个BUG_ON()截获。
修改内核'目录下drivers/media/video/gspca/gspca.c文件
static int alloc_and_submit_int_urb(struct gspca_dev *gspca_dev, (在这个函数下边加上绿色部分)
usb_rcvintpipe(dev, ep->bEndpointAddress),
buffer, buffer_len,
int_irq, (void *)gspca_dev, interval);
urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;(加上这一行)
gspca_dev->int_urb = urb;
ret = usb_submit_urb(urb, GFP_KERNEL);