USB无线网络适配器在系统中的应用
式下的数据读取例程:
static __u8 SL811Read (hci_t * hci, __u8 offset)
{
WRITE_INDEX (offset);
return (READ_DATA ());
}
static void SL811BufRead (hci_t * hci, __u8 offset, __u8 *buf, __u8 size)
{
WRITE_INDEX (offset);
while (size——) {
*buf++ = READ_DATA();
}
}
l 控制模块和控制寄存器用来控制芯片正确工作,USB总线状态也保存在寄存器中。
l 中断控制器和接口逻辑实现与MCU的接口。
2.3 USB HCD的实现
如前所述,USB HCD是USB系统控制主机控制器的工具,它的实现依赖于具体的硬件。因此,除了硬件系统的搭建以外,USB主控制器的实现大部分是HCD的实现。篇幅所限,这里仅给出主要的数据结构和函数调用。
usb_bus结构描述了usb核心层里的USB总线结构,下面列出了usb_bus结构里的主要成员。
struct usb_bus {
int busnum; /* USB总线号*/
char *bus_name; /* USB总线名称 */
struct usb_devmap devmap; /* 设备 */
struct usb_operations *op; /* 对应于特定HCI的操作 */
struct usb_device *root_hub; /*根hub */
void *hcpriv; /* Host Controller private data */
……
};
op指向一个usb_operations型数据结构,该数据结构用来给USB核心层指定hci操作的函数指针:
static struct usb_operations hci_device_operations = {
allocate: hci_alloc_dev,
deallocate: hci_free_dev,
get_frame_number: hci_get_current_frame_number,
submit_urb: hci_submit_urb,
unlink_urb: hci_unlink_urb,
};
void *hcpriv是一个无类型指针,指向一个HCI数据结构,可以是UHCI,OHCI,或其他HCI。在这里,它指向SL811HC的hci_t数据结构。下面给出了SL811HC的hci_t数据结构的主要成员。
typedef struct hci {
struct virt_root_hub rh; /* 主机控制器的虚拟根hub的私有成员 */
struct list_head ctrl_list; /* 控制端点的列表 */
struct list_head bulk_list; /* 批量传输端点的列表*/
struct list_head iso_list; /* 同步传输端点的列表*/
struct list_head intr_list; /* 中断传输端点的列表*/
td_array_t *td_array; /* 事务描述符队列 */
td_array_t a_td_array;
td_array_t i_td_array[2];
struct usb_bus *bus; /* 指向usb_bus的指针 */
……
} hci_t;
在hci_t数据结构中,有一个指向usb_bus的指针。可见,hci_t数据结构和usb_bus数据结构互相有一个指针指向对方,它们一起完整的描述了USB的总线行为。
3.USB无线网卡的实现及测试
嵌入式主机完成以后,下面的工作就是要将USB无线网卡的驱动程序移植到主机上。本方案采用的无线网卡是ACCTON公司推出的EW3301。该网卡采用带有ARM核的无线局域网MAC层控制器,标准USB接口。射频模块采用Intersil公司的i3861 IEEE802.11b基带控制器。
将无线网卡驱动程序安装到uClinux源代码的./driver/usb目录下,并且对Config.in文件和Makefile文件做适当修改,将驱动编译进uClinux内核。
在uClinux下,无线网卡的驱动程序是这样工作的:
1. 注册USB设备驱动程序,建立设备驱动索引
2. 网卡插入后,根据索引寻找到相应的驱动程序
3. 下载固件
4. 注册一个新的无线网卡设备
至此,目标系统里会多了一个无线网卡设备wlan0,使用ifconfig命令设定网卡地址:
/> ifconfig wlan0 192.169.0.100 up
用iwconfig命令配置无线网卡:
/> iwconfig wlan0 channel 6 mode Managed essid SMC
用iwconfig命令查看无线网卡状态:
/> iwconfig
wlan0 IEEE 802.11-DS ESSID:"SMC"
Mode:Managed Channel:6 Access Point: 00:04:E2:7C:60:5E
Bit Rate:11Mb/s
RTS thr=1536 B Fragment thr=1536 B
Encryption key:off
Power Management:off
Link Quality:3 Signal level:140 Noise level:0
Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0
Tx excessive retries:0 Invalid misc:0 Missed beacon:0
用ping命令测试网络是否连通:
/> ping 192.169.0.1
PING 192.169.0.1 (192.169.0.1): 56 data bytes
64 bytes from 192.169.0.1: icmp_seq=0 ttl=64 time=4.2 ms
64 bytes from 192.169.0.1: icmp_seq=1 ttl=64 time=4.2 ms
——- 192.169.0.1 ping statistics ——-
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 4.2/4.2/4.2 ms
结语
通过USB接口将无线网卡同嵌入式主机连接,可以使嵌入式主机方便的从固定状态转为移动状态,大大增强了系统的灵活性。同时,这样的嵌入式移动主机也为下一步移动IP(Mobil
- Linux系统下USB摄像头驱动程序开发(04-25)
- 基于uClinux嵌入式系统的汽车黑匣子的设计(07-08)
- 基于WinCE操作系统的通用USB数控键盘设计(08-05)
- 基于WinCE的ARM视频监控系统(11-14)
- 基于LabVIEW的USB实时数据采集处理系统的实现(03-26)
- 基于DSP和USB的高速数据采集与处理系统设计(05-01)