各位专家,我公司基于DM6467平台开发的一款产品,需要支持同时使用多张3G无线上网卡,但是,在开发过程中,发现只能挂载2到3张3G卡。后来经过调试,发现有一个地方会直接影响到支持3G卡数量(但通过这种方式,还是只能支持到3张)。
以下是linux-2.6.18内核drivers/usb/musb/musb_core.c文件中的部分代码
代码一:以下是USB对中断、批量、等时、以及一种未知模式的内存空间分配数量的定义
/* mode 2 - fits in 4KB */
static struct fifo_cfg __initdata mode_2_cfg[] = {
{ .hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 512, },
{ .hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 512, },
{ .hw_ep_num = 2, .style = FIFO_TX, .maxpacket = 512, },
{ .hw_ep_num = 2, .style = FIFO_RX, .maxpacket = 512, },
{ .hw_ep_num = 3, .style = FIFO_TX, .maxpacket = 512, },
{ .hw_ep_num = 3, .style = FIFO_RX, .maxpacket = 512, },
{ .hw_ep_num = 4, .style = FIFO_RXTX, .maxpacket = 512, },
};
代码二:下面是用于给USB控制端点的内存空间分配定义
static struct fifo_cfg __initdata ep0_cfg = {
.style = FIFO_RXTX, .maxpacket = 64,
};
代码一中,hw_ep_num = 4 中,当maxpacket为256时,可以挂2张联通,如果将此值改为512,能支持3张联通卡。
我分析了USB核心对hw_ep_num 各项的使用,其中maxpacker会用于给各个端点分配内存空间,1为批量端点(BULK)、2为等时端点(ISO)、3为中断端点(INTR),控制端点的利用的是代码二中定义的数据分配,我对USB理解是USB存在4个端点分别为控制、中断、等时、批量4个端点(上面的hw_ep_num = 4不是给控制端点分配的),我不明白的是为什么要再为hw_ep_num = 4时也分配内存空间,而且对它分配的内存空间大小还会直接导致3G卡支持数量的变化,请问这部分内存空间是用来做什么的?为什么这个内存空间会导致设备支持3G卡数量的变化?请问还可能会有别的原因导致这种支持USB设备数量的原因吗?
drivers/usb/musb/musb_core.c文件中
1069行:
switch (cfg->style) {
case FIFO_TX:
musb_writeb(mbase, MUSB_TXFIFOSZ, c_size);
musb_writew(mbase, MUSB_TXFIFOADD, c_off);
hw_ep->tx_double_buffered = !!(c_size & MUSB_FIFOSZ_DPB);
hw_ep->max_packet_sz_tx = maxpacket;
break;
case FIFO_RX:
musb_writeb(mbase, MUSB_RXFIFOSZ, c_size);
musb_writew(mbase, MUSB_RXFIFOADD, c_off);
hw_ep->rx_double_buffered = !!(c_size & MUSB_FIFOSZ_DPB);
hw_ep->max_packet_sz_rx = maxpacket;
break;
case FIFO_RXTX:
musb_writeb(mbase, MUSB_TXFIFOSZ, c_size);
musb_writew(mbase, MUSB_TXFIFOADD, c_off);
hw_ep->rx_double_buffered = !!(c_size & MUSB_FIFOSZ_DPB);
hw_ep->max_packet_sz_rx = maxpacket;
musb_writeb(mbase, MUSB_RXFIFOSZ, c_size);
musb_writew(mbase, MUSB_RXFIFOADD, c_off);
hw_ep->tx_double_buffered = hw_ep->rx_double_buffered;
hw_ep->max_packet_sz_tx = maxpacket;
hw_ep->is_shared_fifo = true;
break;
}
上面部分是直接使用了代码一、代码二中定义的数据来配置USB主机的。