搜档网
当前位置:搜档网 › RT3070驱动移植

RT3070驱动移植

RT3070驱动移植
RT3070驱动移植

RT3070驱动移植

无线网卡为RT3070,驱动分为STA驱动和SoftAP驱动两种,STA驱动支持无线网卡工作在STA模式下,而SoftAP的驱动支持无线网卡工作在软AP的模式下,可以作为一个软的接入点。STA驱动为

2010_0831_RT3070_Linux_STA_v2.3.0.0_DPO.bz2。SoftAP的驱动是:

2010_0203_RT3070_SoftAP_v2.4.0.1_DPA.bz2。需要移植STA驱动和SoftAP驱动,两款驱动的移植步骤差不多。下边首先对STA驱动进行移植。

STA驱动的移植

#tar jxvf 2010_0831_RT3070_Linux_STA_v2.3.0.0_DPO.bz2

cd 2010_0831_RT3070_Linux_STA_v2.3.0.0_DPO

修改原有的Makefile文件如下(只给出需要修改的部分,“-”表示删除的行,“+”表示添加的行):

+#Makefile for RT3070 on MBC-SAM9G45

+#2010_11_13 by liyi

RT28xx_MODE = STA

TARGET = LINUX

CHIPSET = 3070

-PLATFORM = PC

+PLATFORM = IXP

ifeq ($(PLATFORM),IXP)

-LINUX_SRC = /project

-CROSS_COMPILE = arm-linux-

+LINUX_SRC = /home/Embest_SAM9G45/linux-2.6.30

+CROSS_COMPILE = /usr/local/arm2007q1/bin/arm-none-linux-gnueabi-

endif

修改os/linux文件夹中的config.mk文件,需要修改的地方如下(只给出需要修改的部分):

# Support Wpa_Supplicant

- HAS_WPA_SUPPLICANT=n

+HAS_WPA_SUPPLICANT=y

# Support Native WpaSupplicant for Network Maganger

-HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=n

+HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=y

ifeq ($(PLATFORM),IXP)

- WFLAGS += -DRT_BIG_ENDIAN

+#WFLAGS += -DRT_BIG_ENDIAN

endif

ifeq ($(PLATFORM),IXP)

EXTRA_CFLAGS := -v $(WFLAGS) -I$(RT28xx_DIR)/include

endif

ifeq ($(PLATFORM),IXP)

- CFLAGS := -v -D__KERNEL__ -DMODULE -I$(LINUX_SRC)/include

-I$(RT28xx_DIR)/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -Uarm -fno-common -pipe -mapcs-32

-D__LINUX_ARM_ARCH__=5 -mcpu=xscale -mtune=xscale -malignment-traps -msoft-float $(WFLAGS)

- EXTRA_CFLAGS := -v $(WFLAGS) -I$(RT28xx_DIR)/include

- export CFLAGS

-

+

endif

修改完成以后,通过以下命令编译:

make ARCH=arm KBUILD_NOPEDANTIC=1

如果不加KBUILD_NOPEDANTIC=1将出现CFLAGS was changed in …. Fix it to use EXTRA_CFLAGS的错误,编译不能通过。编译完成后,会在os/linux文件夹中生成rt3070sta.ko的驱动模块。此模块通过下载工具可以下载到/mnt目录。

在驱动目录下新建一个文件夹Wireless/RT2870STA,将RT2870STA.dat复制进Wireless/RT2870STAm目录下,同时将此文件夹拷贝进开发板。从超级终端进入开发板目录/mnt使用以下命令将Wireless文件夹拷贝到/etc目录下,将

rt3070sta.ko拷贝进/home/root用户目录下:

#cp /mnt/Wireless /usr –r

#cp /mnt/rt3070sta.ko /home/root

打开root目录,加载驱动模块:

#cd /home/root

#insmod rt3070sta.ko

如果加载出现一下错误:

#insmod rt3070sta.ko

insmod: error inserting 'rt3070sta.ko': -1 Unknown symbol in module

#dmesg | grep rt3070

[ 2443.154486] rt2070ap: Unknown symbol usb_alloc_urb

[ 2443.154628] rt2070ap: Unknown symbol usb_free_urb

[ 2443.155032] rt2070ap: Unknown symbol usb_register_driver

[ 2443.155324] rt2070ap: Unknown symbol usb_put_dev

[ 2443.155439] rt2070ap: Unknown symbol usb_get_dev

[ 2443.155652] rt2070ap: Unknown symbol usb_submit_urb

[ 2443.156164] rt2070ap: Unknown symbol usb_control_msg

[ 2443.156553] rt2070ap: Unknown symbol usb_deregister

[ 2443.157013] rt2070ap: Unknown symbol usb_kill_urb

[ 2443.157116] rt2070ap: Unknown symbol usb_buffer_free

[ 2443.157443] rt2070ap: Unknown symbol find_vpid

[ 2443.157675] rt2070ap: Unknown symbol usb_buffer_alloc

则需要在文件os/linux/usb_main_de v.c文件的开头加上如下一行代码:MODULE_LICENSE(“GPL”);

然后重新编译、重新加载,即可得到正确的结果。

用ifconfig -a命令查看网络,如果加载成功,不会有任何提示,同时可以查看到ra0设备的存在。

加载上模块过后,可以用相关命令设置无线网卡。命令包括iwpriv、iwconfig、iwlist、ifconfig等。比如设置无线网卡地址为192.168.1.5:

ifconfig ra0 192.168.1.5

设置无线网络模式为ad-hoc模式:

iwpriv ra0 set NetworkType=Adhoc

设置SSID名为isn313:

iwconf ra0 essid isn313

查看无线网络:

iwlist ra0 scanning

SoftAP驱动移植

解压驱动2010_0203_RT3070_SoftAP_v2.4.0.1_DPA.bz2,然后进入目录:tar jxvf 2010_0203_RT3070_SoftAP_v2.4.0.1_DPA.bz2

cd 2010_0203_RT3070_SoftAP_v2.4.0.1_DPA

修改Makefile如下(“-”表示删除的行,“+”表示添加的行):

+#Makefile for RT3070 on MBC-SAM9G45

+#2010_11_13 by liyi

RT28xx_MODE = AP

TARGET = LINUX

CHIPSET = 3070

-PLATFORM = PC

+PLATFORM = IXP

………

ifeq ($(PLATFORM),IXP)

-Linux_SR C = /project………..

-CROSS_COMPILE = arm-linux-

+LINUX_SRC = /home/Embest_SAM9G45/linux-2.6.30

+CROSS_COMPILE = /usr/local/arm2007q1/bin/arm-none-linux-gnueabi-endif

注意,在2010_0203_RT3070_SoftAP_v2.4.0.1_DPA.bz2驱动中,有三个文件夹,分别为MODULE、NETIF、UTIL,在这三个文件中均有Makefile,所有的Makefile 都需要如上修改,同样,三个文件夹中的config.mk文件也都需要修改。

修改config.mk配置文件。

ifeq ($(PLATFORM),IXP)

- WFLAGS += -DRT_BIG_ENDIAN

+#WFLAGS += -DRT_BIG_ENDIAN

endif

ifeq ($(PLATFORM),IXP)

#WFLAGS += -DRT_BIG_ENDIAN

endif

ifeq ($(PLATFORM),IXP)

CFLAGS := -v -D__KERNEL__ -DMODULE -I$(LINUX_SRC)/include

-I$(RT28xx_DIR)/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2

-fno-strict-aliasing -fno-common -Uarm -fno-common -pipe -mapcs-32

-D__LINUX_ARM_ARCH__=5 -mcpu=xscale -mtune=xscale -malignment-traps

-msoft-float $(WFLAGS)

EXTRA_CFLAGS := -v $(WFLAGS) -I$(RT28xx_DIR)/include

export CFLAGS

endif

对不起,在修改驱动config.mk文件的时候,红色修改部分没有给全,应该是把CFLAGS 和EXTRA_FLAGS中的-mbig-endian选项去掉,因为在ARM中采用的小端模式!特此更正!

所有的config.mk都修改好以后,通过以下命令进行编译:

make ARCH=arm KBUILD_NOPEDANTIC=1

如果编译不能通过,请检查是否所有的文件夹中的Makefile和config.mk都已经修改。编译通过后,将在三个文件夹中分别生成三个可加载模块:rt3070ap.ko,rtutil3070ap.ko,rtnet3070ap.ko。通过USB接口将这三个模块和rt2870ap.dat文件下载到开发板目录下。并将文件移动到相应位置:

#mkdir /etc/Wireless/

#mkdir /etc/Wireless/RT2870AP/

#cp /mnt/rt2870ap.dat /etc/Wireless/RT2870AP/RT2870AP.dat

#cp /mnt/rt3070ap.ko /home/root

#cp /mnt/rtutil3070ap.ko /home/root

#cp /mnt/rtnet3070ap.ko /home/root

第三行中,在RT2870AP文件夹中的.dat文件名必须是大写的,否则模块将无法读取。

移动好后,进入root目录并加载模块:

#cd /home/root

#insmod rtutil3070ap.ko

#insmod rt3070ap.ko

#insmod rtnet3070ap.ko

#ifconfig ra0 up

此处,加载模块一定要按此顺序加载,否则将出现以下错误(用dmesg函数可查看相关错误信息):

#insmod rt3070sta.ko

insmod: error inserting 'rt3070sta.ko': -1 Unknown symbol in module

#dmesg | grep rt3070

[ 1011.612979] rt3070ap: Unknown symbol rausb_buffer_free

[ 1011.613153] rt3070ap: Unknown symbol RtmpOSTaskNotifyToExit

[ 1011.613410] rt3070ap: Unknown symbol rausb_buffer_alloc

[ 1011.613536] rt3070ap: Unknown symbol RTMPFreeNdisPacket

[ 1011.613692] rt3070ap: Unknown symbol AdapterBlockAllocateMemory [ 1011.613816] rt3070ap: Unknown symbol RTMP_IndicateMediaState

[ 1011.614106] rt3070ap: Unknown symbol RTMP_SetPeriodicTimer

[ 1011.614241] rt3070ap: Unknown symbol os_alloc_mem

[ 1011.614373] rt3070ap: Unknown symbol ClonePacket

[ 1011.614505] rt3070ap: Unknown symbol RTDebugLevel

[ 1011.614646] rt3070ap: Unknown symbol announce_802_3_packet

[ 1011.614780] rt3070ap: Unknown symbol Sniff2BytesFromNdisBuffer

[ 1011.614916] rt3070ap: Unknown symbol RTMP_OS_Add_Timer

[ 1011.615043] rt3070ap: Unknown symbol rausb_submit_urb

[ 1011.615167] rt3070ap: Unknown symbol RTMP_AllocateFragPacketBuffer [ 1011.615292] rt3070ap: Unknown symbol rausb_alloc_urb

[ 1011.615491] rt3070ap: Unknown symbol RtmpOSNetPktAlloc

[ 1011.615616] rt3070ap: Unknown symbol VLAN_8023_Header_Copy

[ 1011.615739] rt3070ap: Unknown symbol RTMP_OS_Mod_Timer

[ 1011.615863] rt3070ap: Unknown symbol os_free_mem

[ 1011.616005] rt3070ap: Unknown symbol rausb_control_msg

[ 1011.616079] rt3070ap: Unknown symbol duplicate_pkt_with_TKIP_MIC [ 1011.616079] rt3070ap: Unknown symbol duplicate_pkt_with_VLAN [ 1011.616079] rt3070ap: Unknown symbol DuplicatePacket

[ 1011.616079] rt3070ap: Unknown symbol RtmpOSTaskCustomize

[ 1011.616079] rt3070ap: Unknown symbol RTMP_OS_Del_Timer

[ 1011.616079] rt3070ap: Unknown symbol rausb_free_urb

[ 1011.616079] rt3070ap: Unknown symbol get_netdev_from_bssid

[ 1011.616079] rt3070ap: Unknown symbol hex_dump

[ 1011.616079] rt3070ap: Unknown symbol RtmpOSFileOpen

[ 1011.616079] rt3070ap: Unknown symbol RTMPFreeAdapter

[ 1011.616079] rt3070ap: Unknown symbol RtmpOSFSInfoChange

[ 1011.616079] rt3070ap: Unknown symbol wlan_802_11_to_802_3_packet [ 1011.618201] rt3070ap: Unknown symbol RTMP_GetCurrentSystemTime [ 1011.618341] rt3070ap: Unknown symbol RTMPAllocateNdisPacket

[ 1011.618498] rt3070ap: Unknown symbol RTMPSendWirelessEvent

[ 1011.618621] rt3070ap: Unknown symbol RTMPL2FrameTxAction

[ 1011.618747] rt3070ap: Unknown symbol rausb_kill_urb

[ 1011.618899] rt3070ap: Unknown symbol RTMP_OS_Init_Timer

[ 1011.619022] rt3070ap: Unknown symbol RTMPusecDelay

[ 1011.619147] rt3070ap: Unknown symbol update_os_packet_info

[ 1011.619312] rt3070ap: Unknown symbol RtmpOSFileRead

[ 1011.619517] rt3070ap: Unknown symbol RtmpOSFileClose

[ 1011.619641] rt3070ap: Unknown symbol RTMP_QueryPacketInfo

[ 1011.619764] rt3070ap: Unknown symbol RtmpOSFileWrite

在加载过程中若出现以下错误:

[421.461365] rt3070ap: module license 'RALINK' taints kernel.

[421.461723] Disabling lock debugging due to kernel taint

请修改UTIL/os/linux/usb_main_dev.c文件,在文件的开头加上如下一行程序:MODULE_LICENSE(“GPL”)

重新编译:

#make clean

#make KBUILD_NOPEDANTIC=1

然后再重新下载,按顺序加载模块即可成功。

模块加载成功后,用一下命令可查看相关信息:

#ifconfig –a

eth0 Link encap:Ethernet HWaddr 3A:1F:34:08:54:54

BROADCAST MULTICAST MTU:1500 Metric:1

RX packets:0 errors:0 dropped:0 overruns:0 frame:0

TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:1000

RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

Interrupt:25 Base address:0xc000

lo Link encap:Local Loopback

inet addr:127.0.0.1 Mask:255.0.0.0

UP LOOPBACK RUNNING MTU:16436 Metric:1

RX packets:8 errors:0 dropped:0 overruns:0 frame:0

TX packets:8 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:0

RX bytes:576 (576.0 B) TX bytes:576 (576.0 B)

ra0 Link encap:Ethernet HWaddr 00:00:00:00:00:00

BROADCAST MULTICAST MTU:1500 Metric:1

RX packets:0 errors:0 dropped:0 overruns:0 frame:0

TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:1000

RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

#iwconfig ra0

ra0 RTWIFI SoftAP ESSID:"RT2860AP" Nickname:""

Mode:Managed Channel=11 Access Point: 00:0C:43:41:6F:A6

Bit Rate=150 Mb/s

用ifconfig命令设定ra0的IP地址:

#ifconfig ra0 192.168.1.1

ra0 Link encap:Ethernet HWaddr 00:0C:43:41:6F:A6

inet addr:192.168.1.1 Bcast:192.168.1.255 Mask:255.255.255.0

UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

RX packets:0 errors:0 dropped:0 overruns:0 frame:0

TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:1000

RX bytes:121922 (119.0 KiB) TX bytes:9072 (8.8 KiB)

至此,一个默认的名为RT2860AP的网络就建立起来了。用iwconfig命令可修改网络的相关参数。如:

#iwconfig ra0 set SSID=”RT_AP”

#iwconfig ra0

ra0 RTWIFI SoftAP ESSID:"RT_AP" Nickname:""

Mode:Managed Channel=11 Access Point: 00:0C:43:41:6F:A6

Bit Rate=150 Mb/s

结束后,可以通过以下命令卸载模块:

#ifconfig ra0 down

#rmmod rtnet3070ap.ko

#rmmod rt3070ap.ko

#rmmod rtutil3070ap.ko

将驱动移植到64位Windows操作系统

将驱动移植到64位Windows操作系统 x64位操作系统和x32位操作系统的最大区别就是内存寻址方式的不同。而64位操作系统不支持32位的驱动程序,因为驱动程序和windows内核同处于一个地址空间中。这是移植32位驱动到64位驱动的最大原因。当然,64位驱动程序可以使用更大的分页内存,非分页内存及系统缓存。而且,你的设备从此就支持64位windows操作系统了。 1.在X64下的驱动程序安装 除了要把应用程序的32位驱动程序变成64位程序之外,驱动的安装程序和其它配置文件同样需要修改。也就是说,对于要在x64上运行的32位程序,它所依赖的驱动仍然需要是64位的。这些相关程序包括inf文件,device installers, class installers和co-installers。相关资料可查看MSDN Libarary DDK:Porting Your Driver to 64-Bit Windows。 所以,要改造应用程序的安装程序。方法是,让32位版的驱动安装为缺省安装选项,即用户插入安装光盘之后,依然运行32位安装程序。但当程序调用UpdateDriverForPlugAndPlayDevices返回值为ERROR_IN_WOW64时,这说明该安装程序正运行在64位Windows环境中。此时,这个安装程序应该调用CreateProcess函数来启动64位的安装进程。这个64位的安装进程通过调用64位驱动目录下的inf文件进行驱动安装。 2.驱动要支持32位IOCTL 某些IOCTL可能包含含有指针的结构,所以,要特别小心的区别对待它,必须根据被调用者解析结构或者输出结构。 有三种办法可以解决这个问题: 1.尽量避免使用IOCTL传递包含有指针的结构; 2.通过API IoIs32bitProcess()来判断上层调用者的程序类型; 3.在64位程序中采用新的IOCTL命令; 例子: IOCTL structure in header file typedef struct _IOCTL_PARAMETERS {

音频系统方案说明(新)

1.1.1音频系统 1.1.1.1需求分析 指挥中心是进行处突指挥工作的核心场所,其音频系统主要负责首长指挥、会议发言及扩声系统建设。保证指挥中心拥有均匀的声场覆盖。 指挥中心长约14.8米、宽约13.3米,房间高度约6米。需要容纳大约88人,整个指挥中心的房高比较高,要求会议中心的扩声可以均匀的覆盖整个房间。具有音视频播放功能的设备,在控制席位要配有监听音箱,以便操控人员进行双向通信。 具体建设内容如下: a)指挥中心安装一套音响设备; b)指挥中心配备一套32席会议系统; c)指挥中心配备2支无线手持话筒; d)控制室配备一台32路数字调音台、1对监听音箱、1个监听耳机; e)控制室配备一台蓝光DVD。 1.1.1.2系统设计 配置了32支发言单元,满足整个指挥中心大厅音频系统不同发言需求。在控制室控制席位配置了监听音箱,方便与会领导人员很好监听到整个指挥大厅会议实况。系统配置了音视频播放设备,满足指挥大厅音视频播放功能。 系统主扩声采用左右扩声的方式,参谋作业区采用吸顶音箱,确保整个指挥中心达到均匀的扩声效果。

1.1.1.3系统结构图 图错误!文档中没有指定样式的文字。-1音频系统连接图

1.1.1.4音箱布局图 图错误!文档中没有指定样式的文字。-2音箱布局图

1.1.1.5设计原则 a)可靠性。 系统应具备长期稳定工作的能力,所有选用设备均符合我国或国际上的质量及可靠性标准。 b)实用性。 系统应具备完成工程所要求功能的能力和水准,符合本工程实际需要和国内外有关规范的要求,并且实现容易,操作方便。 c)先进性。 系统是在满足可靠性和实用性要求前提下的最先进的系统。选用设备均选用国际、国内知名厂家近年来的最新产品或专利产品。 d)一致性。 系统应遵循开放系统的原则。 系统应依据技术指标的一致性、互换性选定设备,使系统具备良好的灵活性、兼容性、扩展性和可移植性。 e)经济性。 系统应满足性能与价格之比在同类系统和条件下达到最优,选择最佳性价比的设备。 系统以保证整个指挥大厅有良好的语言清晰度及均匀的声场分布,并且整个扩声系统能较好的解决背景声和人声兼容问题,使得声音更加逼真清晰为设计原则。 1.1.1.6设备安装 2支主扩声音箱安装在指挥中心大屏幕左右两侧,采用壁挂隐藏方式;6支吸顶音箱按图示位置安装在参谋作业区的上方,均采用隐藏方式安装;音箱安装时考虑与整体装修风格配合。 数字音频处理器安装在设备间机柜;调音台安装在控制室操作台上。具体安装高度待立面图确定后再次进行优化声场分析,确定合适位置。 1.1.1.7主要设备性能指标 1.1.1.7.1主扩音箱 1.1.1.8设备清单 表错误!文档中没有指定样式的文字。-1音频系统设备清单

8.1 Pioneer软件、设备驱动程序安装

8.1 Pioneer软件、设备驱动程序安装 8.1.1Pilot Pioneer软件简介 Pilot Pioneer是集成了多个网络进行同步测试的新一代无线网络测试及分析软件。Pilot Pioneer基于PC和Windows 8/7/XP平台,结合了鼎利公司长期无线网络优化的经验和最新的研究成果,除了具备完善的GSM、CDMA、EVDO、WCDMA、TD-SCDMA、LTE网络测试以及Scanner测试功能外,还支持数据后分析功能,如报表汇总,覆盖分析,干扰分析等。 8.1.2软件安装 1.电脑推荐配置 (1)硬件配置 CPU:Intel(R) Core(TM) i5;内存:2.00GB;显卡:SVGA,16位彩色以上显示模式;显示分辨率:1366*768;硬盘空间:100GB或以上;USB口数量:4个。 (2)操作系统 Windows 8(64/32位)/ Windows 7(64/32位)/ Windows XP(要求SP2或以上)。 2.安装步骤 (1)安装驱动程序及运行环境 运行PioneerDriversSetup.exe,该程序为Pilot Pioneer创建软件的运行环境以及测试前的准备。在安装时会出现如下的组件选择界面。 图8-1基础包组件选择 各个模块的说明如下表所示,用户可以根据实际需要选择安装。 表错误!文档中没有指定样式的文字。.1 Pioneer基础包组件说明 组件名称组件说明 Microsoft .net Framework4 微软.net 框架基础组件,初次使用必须安装。 HASP Dongle Driver Pioneer硬件加密锁驱动程序,初次使用必须安装。

u(boot中NANDflash的MTD驱动移植)-

u(boot中NANDflash的MTD驱动移植)- u-boot u-boot中的“与非”闪存的MTD驱动程序迁移移植了linux中的MTD 驱动程序源代码,以支持“与非”闪存擦除、刻录写入和读取驱动程序内存技术设备内存技术设备是Linux的一个子系统,用于访问闪存设备MTD的主要目的是简化新存储设备的驱动,并提供通用接口功能。MTD驱动可以支持CFI接口的非闪存驱动和非闪存驱动。众所周知,“与非”闪存的访问接口不像“非”闪存那样提供标准的CFI访问接口,但“与非”闪存制造商已经对不同品牌和型号的“与非”闪存芯片的访问接口制定了一些常规规定,如命令字、地址序列、命令序列、坏块标记位置、oob区域格式等。 值得注意的是,在工艺方面有两种类型的“与非”闪存:MLC和SLCMLC和SLC属于两种不同类型的NAND闪存SLC的全称是单级单元,即单级单元闪存,而MLC的全称是多级单元,即多级单元闪存。它们的区别在于,SLC的每个单元只能存储一位数据,而MLC 的每个单元只能存储两位数据,MLC的数据密度是SLC的两倍。就页容量而言,还有两种类型的与非:大页与非闪存(例如HY27UF082G2B)和小页与非闪存(例如K9F1G08U0A)这两种类型在页面容量、命令序列、地址序列、页面内访问和坏块识别方面非常不同,并且遵循不同的约定,因此在移植驱动程序时应该特别注意。在下,以大页面NAND flash: HY27UF082G2B为例,介绍NAND flash 的一些基本情况,然后介绍MTD驱动程序的基本结构和流程分析。

最后,介绍了在u-boot中迁移MTD驱动程序的详细步骤: 3 . 4 . 1)nandflash的一些基本信息 fl2400开发板上的NAND Flash芯片型号是现代HY27UF082G2B。英特尔于1988年首次开发了或非闪存技术。它最重要的特点是支持片上执行,彻底改变了EPROM和EEPROM主宰非易失性闪存世界的局面。然后,在1989年,东芝发布了NAND闪存结构,它具有较低的单位成本、较高的容量,并且可以像磁盘一样通过接口轻松升级。“或非”闪存更适合存储少量的关键代码和数据,而“与非”闪存更适合存储大量的高密度数据。 下表说明了非闪存与非闪存的区别:非闪存非闪存性能项目的容量通常为1~4MB,片上支持的最大容量为32MB 8MB~512MB。它可以直接在芯片上启动。它不受支持,需要驱动读取。只有三星芯片支持步进式引导加载器技术,其他芯片必须配备norflash以启动具有较高可靠性、较低位反转概率、常见位反转的引导加载器,并且必须采取验证措施。ECC椭圆曲线算法被推荐用于错误检查和恢复,这导致1/10的非闪存使得非闪存的管理和驱动程序写入更加复杂。存取接口与随机存取存储器和可编程只读存储器相同。地址线地址、数据和命令通过每个使能引脚区和输入/输出线与数据线分开。访问接口可分为地址、数据和命令以及串行访问。随机存取8K-64K块大小(擦除64K~128K单位)必须按顺序存取。擦除时间为5S,慢3毫秒,快速读写速度慢。快速读取,快速读取,刻录和写入可以快速擦除10 ~ 100,000次和100 ~ 100万次。主要用途保存代码和关键数据保存大

alsa 库移植与声音编程

在移植alsa-lib和alsa-utils之前首先要移植alsa-device,保证系统支持alsa 驱动,移好alsa-device后再dev/snd后出现相应的设备: ?controlC0 --> 用于声卡的控制,例如通道选择,混音,麦克风的控制等?midiC0D0 --> 用于播放midi音频 ?pcmC0D0c --〉用于录音的pcm设备 ?pcmC0D0p --〉用于播放的pcm设备 ?seq --〉音序器 ?timer --〉定时器 1. tar -xvf alsa-lib_1.0.23.orig.tar.bz2 (1)配置alsa-lib ./configure --host=arm-fsl-linux-gnueabi --prefix=/opt/ALSA/alsa_lib CC=/opt/gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/bin/a rm-fsl-linux-gnueabi-gcc error: configure error required courses helper header not found 安装libncursesw5-dev。apt-get install libncursesw5-dev configure: error: panelw library not found ./configure加入--with-curses=ncurses /bin/bash: xmlto: command not found 安装xmlto /bin/rm: cannot remove `libtoolt': No such file or directory 强制make! (2) make

USB驱动移植教程

USB驱动移植教程 一.USB驱动框架 在Linux系统中,提供了主机侧和设备侧视角的USB驱动框架,这里,仅仅讲解主机侧角度看到的USB驱动框架。 从主机侧的角度而言,需要编写的USB驱动程序包括主机控制器驱动和设备驱动两类。USB主机控制器驱动程序控 制插入其中的USB设备,而USB设备驱动程序控制该设备如何作为设备与主机通信。在USB主机控制器驱动和USB 设备驱动之间还有一层叫USB核心层。USB核心负责USB驱动管理和协议处理工作,它通过定义一些数据结构、宏 和功能函数,向上为USB设备驱动提供编程接口,向下为USB主机控制器驱动提供编程接口;通过全局变量维护整个 系统的USB设备信息,完成设备热插拔控制、总线数据传输控制等。说了那么多,无图无真相啊~~

Linux USB主机侧驱动总体框架 二.USB驱动移植步骤 1.S5PV210主机控制驱动的移植 USB主机控制器有3种规范,UHCI(Universal Host Controller Interface),这种规范主要是Intel、Via芯片公司提供支 持PC主板的;OHCI(Open Host Controller Interface),这种规范是微软提出来的,主要应用在非PC系统上的嵌入式 领域上的USB芯片;EHCI(Enhanced Host Controller Interface),这种后来为提高USB速度而提出的规范,它支持 最高速度为480Mbps。 在《S5PV210_UM_REV1.1》手册上搜索OHCI关键词,会发现下面一段话 这表明S5PV210这款CPU支持一个USB主机接口,同时支持EHCI和OHCI这两种规范,支持USB1.1和USB2.0规范,支持最高的外设传输速率为480Mbps。注意了,它并不支持USB3.0规范的USB设备,所以做测试的时候,千万不要拿USB3.0规范的USB设备去测试。 2.1移植ohci-s5p驱动 打开内核目录:driversusbhost,发现Linux系统提供了大量的主机控制器驱动,找遍所有平台,都没有找到ohci-s5p.c源码。很遗憾,3.8的内核没有提供S5PV210的USB HOST控制器驱动程序。最好验证有没有提供的办法就是, 烧写网蜂提供的第二版的uImage进去,然后找个U盘、或者鼠标插入Webee210开发板的USB HOST接口,看看串 口有没有打印什么信息,结果是不会有任何反应的。既然没有提供,这就需要我们自己来编写了,这下不好办了吧?

研华设备驱动程序编程使用介绍.pdf

研华设备驱动程序编程使用介绍 (本文件内容适用于所有数字量和模拟量采集卡) 这一部分包括了创建DA&C应用的基本信息,介绍了设备驱动程序文件的特点,讲解了基本的使用方法。 ?Visual C++ 5.0或更高版本 ?Visual Basic5.0或更高版本 ?Delphi4.0或更高版本 ?Borland C++ 5.0或C++ builder 1.0或更高版本 如果您正在使用的开发工具不是上面所述的几种,请仔细查阅您所使用的工具的文档,了解该工具如何调用动态连接库来创建应用程序。 Windows 95/98/NT/2000的32位DLL的函数库是动态连接,这就是说动态连接库并不直接编译到应用程序的可执行文件中,而只是将动态连接库的路径信息保存在可执行文件中。设备驱动程序只是在可执行程序执行过程中动态连接库被调用的时候才被连接到应用程序。 导入库(*.LIB)包含了它们它们的动态连接库定义的外部函数。它们隐含了动态连接库的位置。如何为您的应用程序引入动态连接库的路径信息,例如:是通过导入函数库还是通过函数声明的方法,取决于您所使用的编程工具。 使用函数原型是良好的编程习惯,这也是为什么设备驱动程序总是被打包成函数原型形式。安装工具为您选择的的开发工具拷贝正确的的原型文件。如果你不打算使用研华驱动程序支持的开发工具,那么您需要创建您自己的函数原型。 按照下面的步骤开始对研华的硬件设备编程应用: 这一部分我们推荐您采用研华的设备驱动程序结合微软的可视化平台来开发您的系统!研华设备驱动程序支持Visual C++ 5.0及其以上的版本。 要使用DA&C函数,需要按照下面的步骤使用研华驱动程序提供的DLL(动态连接库,Dynamic Linked Library) 1.象编写一般的Windows应用程序一样创建您的应用程序代码,在这些代码中可以象典型的函数调用一样调用研华驱动程序中提供的动态连接库中(DLL)的函数。 2.声明在您的程序中用到的函数,即:包含动态连接库(DLL)的头文件,该函数声明了所有的动态连接库中的函数,如下所示: #include “driver.h”

USB音频设备的设计与实现

USB音频设备的设计与实现 Design and Implementatio n of USB Audio Device (江西理工大学)吴君钦 (Jiangxi University of Science and Technology)Wu,Junqin 摘要:在介绍USB音频设备及其驱动程序结构的基础上,对USB Audio功能节点、USB Audio描述符、USB Audio请求、码流同步等设计重要方面进行了详细论述,提出了一种准同步USB码流速度匹配方法。使用准同步法,在一对USB ISO端点上,成功地实现了实时全双工USB音频通信功能,简化了时钟同步系统的设计。 关键词:USB音频,驱动程序, 准同步通信 Abstract:Introduce the structure of USB audio device and the structure of USB audio driver, discuss the function endpoints of USB audio peripheral, the USB audio descriptors,the USB audio request and the synch mechanism for USB audio stream detailly, bring out a new synch method called p lesiochronous communication for USB audio stream speed matching. U sing the p lesiochronous communication model , implement duplex audio communication functions on twain USB ISO endpoints, simplify the design of clock synch system . Key words:USB Audio; Device driver; P lesiochronous communication 1 引言 随着USB接口的推广和普及,越来越多的电脑外部设备采用USB接口, 在便携电脑中,有采用USB口扩展外设取代PCMCIA总线接口的趋势。特别是USB2.0的数据传输速率达480bps,USB实时同步数据传输模式适合于传送高速实时音视频数据流。MP3播放器、U盘等设备的流行,使USB接口的应用更为广泛,若能为这些便携设备增加USB音频功能,MP3等设备将成为语音聊天、网络电话等通信终端设备,大大拓展了应用领域,为此本文对USB音频外部设备的体系结构、工作原理及音频数据码流同步方法等设计的重要方面做详细论述。 2 USB设备与驱动程序 一般,USB外部设备包含一个USB设备控制器(USB peripheral Controller),设备控制器与通信另一端主控制器(USB Host Controller)的端点(Endpiont)管道(Pipe)之间的实现逻辑联接[1][2]。主机端驱动软件包含USB主控器驱动程序、设备驱动程序和应用软件三部分,主控制器驱动程序由操作系统提供支持,USB设备开发人员一般只需编写USB设备驱动程序和用户应用程序两部分,以实现特定的功能。但设备端所有功能的驱动软件必须由开发商完成,关于一般USB设备的设计请参阅文献[1][4][5]。 虽然USB音频流媒体设备各部分与标准USB设备各部件间的逻辑关系相一致,但USB 音频设备(USB Audio Device)有其殊性, 它的结构和实现机制更为复杂。图1是微软推荐的标准USB音频设备WDM驱动序各部分之间的逻辑层次关系[2]。图1 USB音视频流类驱动程序(AVStream Class Driver,USBAudio.sys)运行在USB主机控制器驱动驱动程序之上, 属于USB设备驱动程序范畴。图1黑体部分是与USB Audio有关的驱动和应用程序模块,而其他模块则与USB Audio无关。 如果硬件设备按照USB标准音频设备规范[3]设计,设备开发商无须编写特定的USB设备驱动程序,用户可直接使用Win98、Win2000或后续版本中绑定的标准USB Audio驱动程序,在其他操作系统中也有相应的标准驱动程序,节省了大量的开发时间,所以本文不详细讨论USB Audio驱动程序的设计问题,而重点讨论USB音频设备的设计。此外标准USB音频设备可以与现有的各种音频播放软件、VOIP通信软件实现无缝联接。

S3C2410 下LCD 驱动程序移植及GUI 程序编写

S3C2410下LCD驱动程序移植 及GUI程序编写 Write by llg 著作权所有:刘利国 如转载请告知作者 laoliu@https://www.sodocs.net/doc/5a14143175.html, 并注明出处 https://www.sodocs.net/doc/5a14143175.html, 1.为了不让大家觉枯燥,让朋友们更好的理解,我以一个实例来叙述S3C2410下一个驱动 程序的编写(本文的初始化源码以华恒公司提供的s3c2410fb.c为基础)及简单的GUI 程序的编写。 2.拿到一块LCD,首先要将LCD的各个控制线与S3C2410的LCD控制信号相接,当然, 电源也一定要接入了,否则不亮可别找我。另外需要注意以下几点: 1)背光:对于大部分的彩色LCD一定要接背光,我们才能看到屏上的内容; 2)控制信号:不同的LCD厂商对于控制信号有不同的叫法,S3C2410芯片手册也给出了一个信号的多个名称(图一),这就要看你们硬件工程师的功底了, 图一 S3C2410手册上给出的控制信号的名称及解释 这里我做一个简单的介绍: ?VFRAME:LCD控制器和LCD驱动器之间的帧同步信号。该信号告诉LCD 屏的新的一帧开始了。LCD控制器在一个完整帧显示完成后立即插入一个 VFRAME信号,开始新一帧的显示; ?VLINE:LCD控制器和LCD驱动器之间的线同步脉冲信号,该信号用于LCD 驱动器将水平线(行)移位寄存器的内容传送给LCD屏显示。LCD控制器在 整个水平线(整行)数据移入LCD驱动器后,插入一个VLINE信号; ?VCLK:LCD控制器和LCD驱动器之间的像素时钟信号,由LCD控制器送出的数据在VCLK的上升沿处送出,在VCLK的下降沿处被LCD驱动器采样; ?VM:LCD驱动器的AC信号。VM信号被LCD驱动器用于改变行和列的电压极性,从而控制像素点的显示或熄灭。VM信号可以与每个帧同步,也可以与 可变数量的VLINE信号同步。 3)数据线:也就是我们说的RGB信号线,S3C2410芯片手册上都有详细的说明,由于篇幅关系,在此不一一摘录,不过需要与硬件工程是配合的是他采用了哪种接线 方法,24位16位或其它。对于16位TFT屏又有两种方式,在写驱动前你要清楚

RTOS设备驱动向嵌人式Linux的移植

RTOS设备驱动向嵌人式Linux的移植 ——By Bill Weinberg,MontaVista Software,Inc. Linux暴风雨般占领了嵌入式系统市场。分析家指出,大约有1/3到1/2的32/64位新的嵌入式系统设计采用了Linux。嵌入式Linux已经在很多应用领域显示出优势,比如SOHO家庭网络和成像/多功能外设。在(NAS/SAN)存储,家庭数字娱乐(HDTV/PVR/DVR/STB),和手持设备/无线设备,特别是数字移动电话更获得大幅度发展。 嵌入式Linux新应用不会凭空从开发者的头脑中冒出来,大部分项目都是由成千上万行,甚至数百万行的代码组成。成千上百的嵌入式项目已经成功地将现有的其它平台的代码移植到Linux下,比如Wind River VxWorks和pSOS,VRTX,Nucleus和其它RTOS。这些移植工作有着重要的价值和现实意义。 到目前为止,大多数关于移植已有的RTOS应用到嵌入式Linux的文献,关注RTOS接口(API)、任务、调度模式以及怎样将他们映射到相应得用户空间去。同样重要的是,在I/O调用密集的嵌入式程序中如何将RTOS的硬件接口代码移植到更加规范的Linux设备驱动程序中去。 本文将概述几种常用的经常出现于现有嵌入式应用中的内存映射I/O方法。它们涵盖的范围从对中断服务例程的特殊使用及用户线程对硬件访问到出现于有些ROTS中的半规范化驱动程序模型。这对于移植RTOS代码到规范化的Linux设备启动程序具有一定启发作用,并且介绍了一些移植方法。特别地,本文会重点讨论RTOS和Linux中的内存映射,基于I/O调度队列的移植,将RTOS I/O重定义到Linux下的驱动程序和守护进程里。 RTOS I/O概念 “不规范”是描述大多数RTOS系统I/O的最佳词语。多数RTOS是针对较早的无MMU的CPU 而设计,所以忽略了内存管理部分,即使当MMU问世后也是这样:不区分物理地址和逻辑地址。大多数RTOS还全部运行在特权模式,虽然表面上看来是增强了性能。全部的RTOS应用和系统代码都能够访问整个地址空间、内存映射过的设备、以及其他I/O操作。这样,即使存在差别,也是很难把RTOS应用程序代码同驱动程序代码区分开来。 不规范的结构导致了I/O实现的特殊性。在很多情况下,缺乏设备驱动程序模型的认同。根据这种无层次的特性,回顾一下基于RTOS软件中使用的一些重要概念和习惯用法非常有指导意义。 内嵌的内存访问 上个世纪八十年代中期商业化的RTOS产品中,多数嵌入式软件都有一个对执行时间有严格需求的,采用I/O查询和中断服务例程的大循环。开发人员在项目采用RTOS和执行程序,主要为了加强并行性和多任务同步,绕开其它有碍实现该目标的程序结构。这样,即使RTOS提供了I/O调用形式化方法,嵌入式程序员继续使用直接的I/O操作: 1#define DATA_REGISTER0xF00000F5

RT-Thread驱动移植要点及AT25256驱动

RT-Thread 驱动移植要点 I/O管理模块为应用提供了一个对设备进行访问的通用接口,并通过定义的数据结构对设备驱动程序和设备信息进行管理。从系统整体位置来说I/O管理模块相当于设备驱动程序和上层应用之间的一个中间层。I/O管理模块实现了对设备驱动程序的封装:设备驱动程序的实现与I/O管理模块独立,提高了模块的可移植性。应用程序通过I/O管理模块提供的标准接口访问底层设备,设备驱动程序的升级不会对上层应用产生影响。这种方式使得与设备的硬件操作相关的代码与应用相隔离,双方只需各自关注自己的功能,这降低了代码的复杂性,提高了系统的可靠性。在RT-Thread中,设备也被认为是一类对象,被纳入对象管理器范畴。每个设备对象都是由基对象派生而来,每个具体设备都可以继承其父类对象的属性,并派生出其私有属性。下图即为设备对象的继承和派生关系示意图。 设备对象的继承和派生关系示意图 1. I/O设备管理控制块 struct rt device { struct rt object parent; /* 设备类型*/ enum rt device class type type; /* 设备参数及打开时参数*/ rt_uint16_t flag, open flag; /* 设备回调接口*/ rt_err_t (*rx indicate)(rt_device_t dev, rt_size_t size); rt_err_t (*tx complete)(rt_device_t dev, void* buffer); /* 设备公共接口*/ rt_err_t (*init) (rt_device_t dev); rt_err_t (*open) (rt_device_t dev, rt_uint16_t oflag); rt_err_t (*close) (rt_device_t dev); rt_size_t (*read) (rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size); rt_size_t (*write) (rt_device_t dev, rt_off_t pos, const void* buffer, rt_size_t size); rt_err_t (*control)(rt_device_t dev, rt_uint8_t cmd, void *args); #ifdef RT_USING_DEVICE_SUSPEND rt_err_t (*suspend) (rt_device_t dev); rt_err_t (*resumed) (rt_device_t dev);

无法打开音频设备其它程序可能正在使用此设备

无法打开音频设备其它程序可能正在使用此设备。 RealPlayer 将使用计算机上的声卡进行录制和播放。如果声卡正被其它程序使用,或者RealPlayer 无法探测到声卡,您将收到此错误。 关闭其它正在使用声卡程序便可解决此问题。如果这样做仍不能解决问题,则您需要确定声卡是否工作正常,同时更新旧的声卡驱动程序。 解决方法1:关闭其它正在使用声卡程序便可解决此问题。 Windows 2000、XP: 1.在Windows 任务栏中,单击开始按钮,然后单击运行。 2.在对话框中输入taskmgr,然后单击确定。 3.单击应用程序选项卡。 4.单击程序使其高亮度显示,然后单击结束任务。 5.尝试重新播放内容。 Windows 98SE、ME: 1.在Windows 任务栏中,单击开始按钮,然后单击运行。 2.在对话框中输入taskmgr,然后单击确定。

3.单击程序,然后从Windows 菜单中选择结束任务。请勿结束Systray 和Explorer,因它们是系统运行文件。 4.然后尝试重新播放内容。 解决方法2:核查声卡和驱动程序是否安装正确。 在以下情况下,您可以访问您的计算机或声卡制造商的网站: ?“设备状态”消息提示设备未正常工作。 ?安装的驱动程序与声卡硬件不符。您需要重新安装正确的声卡驱动程序。 ?在设备管理器中看到一个黄色的!或红色的X。您需要重新安装声卡和(或)声卡驱动程序。 Windows 2000、XP: 1. 在Windows 任务栏中,依次单击开始按钮,然后依次选择设置、控制面板,最后单击系统(Windows XP:开始> 控制面板> 系统)。 2.单击硬件选项卡,然后单击设备管理器按钮。 3.单击声音、视频和游戏控制器旁的加号(+)。 4.用鼠标右键单击声卡,然后单击属性。 5.将窗口中的内容与声卡说明书中对声卡驱动程序的描述进行比较。 6.在常规常规选项卡中,确保设备状态的消息为“此设备当前工作正

SGTL5000声卡驱动移植

文库资料 ?2017 Guangzhou ZHIYUAN Electronics Stock Co., Ltd. 第1章 SGTL5000声卡驱动移植 本章导读 产品开发完毕后,因为某些原因,用到的一些芯片停产,这是一件很让人头疼的事情,可是却又不得不面对这样的尴尬情形。如果有兼容的芯片还好处理,如果没有兼容芯片,那就不得不进行改版设计,实现与原来相同的功能。 在EasyARM-i.MX283A 开发过程中就遇到了UDA1380芯片停产的情况,新方案准备采用SGTL5000来进行替换,本章就讲述SGTL5000声卡驱动在i.MX283平台上的移植过程。 1.1 背景交代 由于AP-283Demo 板上的UDA1380音频芯片即将停产,因此要用SGTL5000音频芯片代替。因此需要在EasyARM-i.MX283A 开发板的Linux 内核上实现该芯片的驱动。 EasyARM-i.MX283A 开发板的Linux 内核针对i.MX283处理器已经有了SGTL5000驱动代码,所以这里的工作主是使驱动正常工作起来。 SGTL5000在内核的音频解码/编码驱动源码文件在文件。 SGTL5000在内核的关于处理器平台的源码文件在目录。 1.2 电路原理图 需要制作一块SGTL5000的验证板,其核心电路图如图1.1所示。 图1.1 SGTL5000验证板核心电路图 SGTL5000是并没有使用晶振提供的时钟,而是用了处理器提供MCLK 信号作为系统时钟。 SGTL5000验证板的接口电路图如图1.2所示。SGTL5000是通过I 2S 接口与EasyARM-i.MX283A 开发板实现音频通信。SGTL5000验证板的接口是通过杜邦线与EasyARM-i.MX283A 开发板连接。

动态加载驱动和Linux内核移植

项目三:Linux内核移植 1.能力培养目标 ●了解嵌入式Linux内核的构成 ●掌握内核裁减定制的方法 ●掌握内核编译的方法 ●掌握内核烧写的方法 2.项目任务要求 (1)项目任务 Linux内核的裁剪、编译和烧写。 (2)项目来源及应用 对于较复杂的嵌入式系统项目,当硬件平台制作好之后,就需要向其移植操作系统,如果移植的是嵌入式Linux且为GUI应用,那么移植过程一般包含: 第一步,移植引导程序(Vivi、BLOB、uBoot等); 第二步,移植内核kernel;(本次实验内容) 第三步,移植根文件系统; 第四步,移植库文件,如QT库; 第五步,运行项目程序。 (3)功能需求 裁减一个可用的Linux内核 ●选择正确的处理器类型 ●使其支持网卡、小键盘、USB鼠标、声卡等设备 ●成功编译后烧写到目标机上 ●内核能正确加载运行 ●键盘驱动可用 (4)项目开发环境需求

3.项目预习 (1)了解项目目标、项目任务要求、项目设计和项目实施步骤。 (2)下载本次实验所需要的软件和代码。将3_kbd_test目录放到linux虚拟机的up-techpxa270cl目录下。 (3)完成内核裁剪及编译好内核映像,即完成第5大项中的步骤(4)-(5)。 (4)回答以下问题 如何能够在目标机上访问宿主机上的文件? 说明使用mount命令进行文件挂载的方法。 说明mount命令执行不成功可能的原因和解决方法。 说明本实验所使用的Linux内核版本。 说明Linux内核裁减定制的方法。 4.项目设计 4.1选择Linux内核裁减方法 Linux内核的裁减配置的三种命令: 1、make config:命令行模式,一行一行的配置,不推荐使用。 2、make menuconfig:大多人熟悉的menuconfig菜单。 3、make xconfig:基于QT图形化配置,菜单结构清晰。 所有内核裁减配置过程,都是通过Config.in(2.4内核)或Kconfig(2.6内核)经由不同脚本解释器产生.config配置文件。

USB音频设备类的音频信号同步解决方案

USB音频设备类的音频信号同步解决方案 本文针对使用USB_Audio_Class进行语音设备设计时需要解决的音频信号同步问题进行了介绍,并给出了相应的解决方法和部分源代码。 引言 USB总线协议经历了从USB1.1到USB2.0再到目前的USB OTG(USB On-The-Go)的发展过程,在USB不断发展完善的同时,越来越多的USB产品大量上市。现在的PC机通过USB Hub 设备和多个USB控制器,能同时支持扩展的USB设备已经达到数百个。 在USB总线传输中,任何一次USB的数据传输都必须由主机来发起和控制,所有的USB 外设都只能和主机建立连接,任何两个外设之间或者两个主机之间无法直接通信。目前,扮演主机角色的大多是个人电脑(PC)。 USB协议制定时,为了方便不同设备的开发商基于USB进行设计,定义了不同的设备类来支持不同类型的设备。现在市场上的USB产品,通过调查会发现它们主要应用了以下设备类: USB_DEVICE_CLASS_HUMANINTERFACE键盘、鼠标等 USB_DEVICE_CLASS_STORAG U盘、活动硬盘、数码相机等 USB_DEVICE_CLASS_PHYSICAL_INTERFACE力回馈游戏杆、方向盘等 USB_DEVICE_CLASS_POWER风扇、LED台灯、手机充电等 USB_DEVICE_CLASS_PRINTER打印机 从市场上看,虽然在USB标准中定义了USB_DE-VICE_CLASS_AUDIO,但是很少有此类设备问世。目前称为USB音箱的设备,大都使用USB_DEVICE_CLASS_POWER,仅仅将USB接口作为电源使用。信号仍然需要3.5mm立体声音频线连接使用,连接相对复杂。这样没有体现USB设备连接简单,操作方便的优势,且采用模拟信号传送会产生一定的信号失真,影响音质。 本文为了设计实现一个完全基于USB协议的USB_DEVICE_CLASS_AUDIO设备,采用一根USB连接线,在设备中不同的端点(endpoint)实现音频信号的输入,输出包括相关按键控制,并重点讨论如何解决由于USB特殊的总线拓扑结构造成的信号同步问题。 1USB_DEVICE_CLASS_AUDIO介绍 为简化USB设备的开发过程,USB提出了设备类的概念。其中的音频设备类(USB_DEVICE_CLASS_AU-DIO)是目前为止使用比较少的类型。

linux视频驱动移植

V4L2视频驱动的移植与应用 V4L2(video for linux) 可以支持多种设备,它可以有以下5种接口: 1、视频采集接口(video capture interface):这种应用的设备可以是高频头或者摄像头.V4L2的最初设计就是应用于这种功能的.下面也是着重讲解这种应用; 2、视频输出接口(video output interface):可以驱动计算机的外围视频图像设备——像可以输出电视信号格式的设备; 3、直接传输视频接口(video overlay interface):它的主要工作是把从视频采集设备采集过来的信号直接输出到输出设备之上,而不用经过系统的CPU; 4、视频间隔消隐信号接口(VBI interface):它可以使应用可以访问传输消隐期的视频信号; 5、收音机接口(radio interface):可用来处理从AM或FM高频头设备接收来的音频流; V4L2驱动的主要功能是使程序有发现设备的能力和操作设备.它主要是用过一系列的回调函数来实现这些功能.像设置高频头的频率,帧频,视频压缩格式和图像像参数等等. 一、V4L2的移植 V4L2提供了三种不同的API来传输外围设备和用户空间的数据。下面就vivi(drivers/media/video/vivi.c)来讲解一个V4L2驱动的编写。注意它是一个虚拟的设备驱动,没有与实际的硬件打交道。 1、分析几个重要数据结构: vivi.c包含头文件v4l2-device.h和v4l2-ioctl.h,其中v4l2-device.h中包含了v4l2-subdev.h,v4l2-subdev.h中又包含了v4l2-common.h,v4l2-common.h中包含了v4l2-dev.h。 在v4l2-dev.h中定义了结构体video_device和v4l2_file_operations; 在v4l2-ioctl.h中定义了结构体v4l2_ioctl_ops; 在v4l2-device.h中定义了结构体v4l2_device; 1) vivi_fops static const struct v4l2_file_operations vivi_fops = { .owner = THIS_MODULE, .open = vivi_open, .release = vivi_close, .read = vivi_read, .poll = vivi_poll, .ioctl = video_ioctl2, /* V4L2 ioctl handler */ .mmap = vivi_mmap, }; 2) vivi_ioctl_ops static const struct v4l2_ioctl_ops vivi_ioctl_ops = { .vidioc_querycap = vidioc_querycap, .vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid_cap, .vidioc_g_fmt_vid_cap = vidioc_g_fmt_vid_cap,

RTL8188CUS驱动程序移植笔记

RTL8188CUS驱动程序ARM9移植笔记 移植背景 本人于2015年入手一块周公的AWorks Easy ARM开发板,这块开发板主控为IMX293 ARM9内核,使用的操作系统为Linux 2.35。前段时间入手了一块全志H3的板子,这个板子带有WiFi网卡,可惜到手时官方并没有完成驱动程序的移植。由于使用的网卡为RTL8189FTV,该芯片的驱动程序源码在网上怎么都找不到,折腾了几天未果,就从X宝上买了块USB无线网卡,主控为RTL8188CUS,之所以买这块网卡是因为官网有这块网卡的驱动,并且我在本机Ubuntu15.04系统中找到了该网卡的内核模块,所以我相信不管怎么样,它都是可以在linux系统下驱动起来的。 在折腾了两天,各种摸索的情况下终于把这块网卡在ARM9的板子上驱动起来了。下面就我这次移植过程做个笔记,其中也包括近期的学习总结 WiFi模块

系统内核配置 内核只能编译一次,内核模块要单独编译,否则版本字符串两者配不上就导致内核模块加载不成功。 源码的配置 驱动程序测试 1)通过网线连接至计算机,把计算机与开发板的IP地址设置为同一个网段 计算机IP地址:192.168.1.12 开发板IP地址:192.168.1.100 2)开发板与计算机直接通过NFS连接并把驱动模块拷贝到开发板 3)加载内核模块

出现如下如下信息则加载成功 rtw_macaddr_cfg MAC Address = 00:13:ef:60:06:19 bDriverStopped:1, bSurpriseRemoved:0, bup:0, hw_init_completed:0 _rtw_drv_register_netdev, MAC Address (if1) = 00:13:ef:60:06:19 usbcore: registered new interface driver rtl8192cu 4)查看我们的USB无线网卡是否被系统激活 执行:ifconfig 发现只有一个网卡,并没有出现我们的USB无线网卡。 执行:ifconfig -a 出现了wlan0 就是我们的无线网卡,接下来激活它。 执行:ifconfig wlan0 up 执行:ifconfig可以看到无线网卡已经被激活了。 5)扫描AP热点 执行:iwlist wlan0 scan | grep ESSID

相关主题