皮皮网
皮皮网

【游戏保护 源码】【eduline源码 java】【libyuv源码剖析】usbhcd源码

来源:扒apk源码 发表时间:2024-12-29 05:57:43

1.Linux9.01 不能识别 SATA 硬盘
2.设计一个用8250实现串口通信

usbhcd源码

Linux9.01 不能识别 SATA 硬盘

       è¿™æ˜¯æ¥è‡ª IBM developerworks 的一个非常好的文章可以清楚地解释如何启动火线和USB设备 Linux操作系统的原理。

       å¸Œæœ›å®ƒåœ¨å¯¹ä»»ä½•æœ‰å…´è¶£æŠŠLinux操作系统安装到外部设备的人有所帮助。

       åŽŸå§‹çš„网址/developerwor...l-fireboot.html

       ä»Žç«çº¿è®¾å¤‡ä¸Šå¯åŠ¨Linux

       å¯ç§»åŠ¨é©±åŠ¨å™¨ä¸Šå®‰è£…Linux操作系统

       éš¾åº¦ç­‰çº§ï¼šä¸­ç­‰

       Martyn Honeyford(martynh@uk.ibm.com) IBM英国实验室 软件工程师

       å®£å¯è¾¾(austin.dada@gmail.com)翻译 webzi@linuxsir

       å¹´7月日

       å¹´7月日开始翻译,7月日完成。

       ç¿»è¯‘经验不多。如有不妥,欢迎EMAIL交流。

       ä½¿ç”¨ä¸€ä¸ªå¤–部驱动器是一个极棒的方法,能给你的老硬件带来新生和让你在你不能(或者不想)改变内置硬盘的计算机上使用Linux系统。

       å‡è®¾ä½ æƒ³ä½¿ç”¨Linux在一个双启动环境,源码但是你的计算机硬盘又没有任何空余的空间。一种解决方法是使用"live"的linux发行版本象是Knoppix,他们这能直接从CD启动运行。 对于偶尔使用,这是一种可行的办法,但是它有若干的劣势:

       *你将会仍然需要些固定文件存储。如果你只是操作少量的文件,一张1.MB的磁盘就可以胜任,或者一个USB闪存棒适合中等量的文件,但是这些都不够理想。

       *当使用一个LiveCD 的时候,最困难、最糟糕、最不可能的是安装你自己的应用程序或者定制现存的程序。

       *使用LiveCD在性能上的牺牲,在启动初所有的设备检测时尤为明显,同样发生使用中(所有的文件从 CD 载入通常是比从硬盘中载入慢的多)。

       çš„确,还有其他可选方案。举例来说,你可以买额外的内置驱动器并且在此安装Linux操作系统。但是常常,你可能没有任何空闲的扩展阜。(这特别容易发生在笔记本上,通常他们只允许一个内置硬盘。)

       æˆ–者,你可以使用一个较大的硬盘取代当前的硬盘, 获得额外空间用于安装 Linux操作系统。 然而,这的确是一个耗费大量时间的方案,需要你重新安装现有的操作系统在新的硬盘, 重新安装和配置你所有应用程序, 和恢复所有数据。

       æ›´å¥½çš„解决方案是购买一个外置硬盘并安装 Linux操作系统。 这样使得你在想使用Linux系统时候不必涉及现有的硬件和软件而只是简单连接外部驱动器。

       å¯é€‰çš„可移动设备

       å¯ç”¨äºŽå®‰è£…Linux操作系统设备涵盖磁盘驱动器、USB-闪存设备、通过USB/火线连接的硬盘等等。

       åœ¨ä¸€ä¸ªå°å®¹é‡çš„设备中安装linux是可行的,例如在一个1.MB的磁盘或者一个MB的USB棒中,他们通常(必须)为特定目的定制,采用裁减的发行版本,例如,拯救中断的安装过程。

       å¤–置的硬盘在为使用一个常规目的的linux系统提供最大的灵活性同时,带来一个合理的成本。

       è®¸å¤šä¸åŒçš„厂商提供许多种不同容量的外置的驱动器。 (Maxtor, 西西部数据, 等等)。这些驱动器还会包含一个外置盒子,用于固定标准的 3-1/2 寸或 2-1/2 寸 IDE 硬盘。 然后这些驱动器经由 USB 或 IEEE(火线) 连接到计算机。

       USB 受到在二个主要的版本中的影响,1.1 和 2.0. 1.1 版速度为 Mbit/ s(每秒1Mbit) ,而 2.0 版支持最高达到 Mbit/s 的传输速度。 大多数2.0相容的驱动器也向后兼容1.1,通常建议尽量不要采用1.1接口除非没有其他的选择(因为其低速不适应此环境。)

       ç«çº¿æ ‡å‡†ä¹Ÿå®šä¹‰è‹¥å¹²ä¸åŒçš„速度, 实际上,大部分人所指的FireWire ,是“FireWire”标准 ,支持最大传输速度为 Mbit/s 。

       USB2.0和火线在速度上不分伯仲: 虽然 USB 2.0 有比较高的传输速度, 但是实际中因为协议的不同两者速度十分的接近。 如果你的计算机拥有2种接口, 最好使用USB而非火线(理由我将后将解释), 但是如果只有火线接口,当然你就选择它了。为了实现最大的灵活性, 可以选择众多同时支持 USB 2.0 和火线的驱动器中的一种。(像我稍后将在这一个文章中使用的那个一样。)

       å¯¹äºŽé‚£äº›æ²¡æœ‰å¿…须的接口, PCI(对于桌面) 和 PCMCIA(对于笔记本型电脑) ,现在火线和USB 2.0扩展卡也并非贵不可及: 举例来说, 我稍后将在文章中提及PCMCIA火线扩展卡大约为英镑.($ 美元以下)

       ä¸ºäº†è¾¾åˆ°æœ¬æ–‡çš„目的,我已经购买 5-1/4寸外置驱动器的硬盘盒。 这是一件非常灵活的硬盘盒,并没提供驱动器而且能固定任何的标准 IDE 设备,包括 3-1/2 寸驱动器和像CD-RW/DVD-RW等5-1/4 寸 IDE 设备 。硬盘盒兼有 USB 2.0 和火线接口。

       ä¸ºäº†æŠŠç¡¬ç›˜ç›’连接到我的IBM Thinkpad T笔记本电脑,我也购买了一个 PCMCIA 火线转接卡。 ( 因为内置的USB 接口只支持USB 1.1)

       ç¡¬ç›˜ç›’和火线转接卡相对比较便宜。 (大约分别为英镑和英镑。)

       æµ‹è¯•æœŸé—´, 我把一个手边闲置的 GB 3-1/2 寸 IDE 硬盘放进硬盘盒——对于真实情况,我会买一个较大的容量驱动器, 现在另购一个硬盘相当低廉( 大约每个英镑!)

       Linux 支持

       æ­£å¦‚你所期待,linux对这些硬盘盒支持的确非常好。任何遵从SBP(串行总线协议)标准的大储存设备在linux中使用非常简单。

       å¤§ä½“上, 使对这些装置的支持你能够将会需要在你的核心中支持某些选项( 或直接地编译或通过模块。)

       å¯¹äºŽUSB和火线,SBP 装置通过SCSI模拟来实现-- 也就是说,Linux会把他们当作SCSI硬盘来处理 。 这是在 Linux 世界里面使用存储设备的一个常规方法。 ( 举例来说, IDE CD/DVD设备通常通过SCSI模拟来连接)。基于以上原因,下列的选项需要被内核支持:

       * SCSI support

       * SCSI emulation

       * SCSI disk support

       é™¤æ­¤ä¹‹å¤–,不同连接方式需要一下的内核支持:

       * 针对火线:

       * IEEE support

       * OHCI support

       * RAW support

       * SBP-2 support

       * 针对USB:

       *(host-side) USB support

       * OHCI support

       * UHCI support

       * USB mass-storage support

       æ˜Žæ˜¾åœ°ï¼Œä½ è¿˜å¿…须为其他的硬件 ( 如显卡等等)编译常规的支持, 而且可能需要一些额外的模块,取决你的具体硬件。

       ä¸¾ä¾‹æ¥è¯´ï¼Œæˆ‘正在使用 PCMCIA(cardbus) 火线转接卡,因此,我还需要增加:

       * PCMCIA support

       * cardbus support

       å®‰è£…

       çŽ°åœ¨æˆ‘们有很完美外置驱动器,我们将开始安装在其安装Linux美妙之旅。

       ç›®å‰æœ€ç®€å•çš„安装linux方法(当然仅个人意见) , 是连接你的所有硬件;(我的情况是,插入火线转接卡,连上转接线盒驱动器,然后打开驱动器的电源) 然后从你选择的发行版安装CD上启动你的计算机。

       æˆ‘采用的发行版是Gentoo(资源详见链接),因此,我用了最新的 “通用”x LiveCD。 (.1) 其他的发行版本必须的步骤大致和此相似。

       ä¸€æ—¦ä½ ä½¿ç”¨å®‰è£…CD启动,要藉由一点运气让他要辨认出你的驱动器。 磁盘应该出现在/dev/sdX, X 是一个小写字母从“a”开始。 在我的系统上,外置硬盘被当做 /dev/sda, 但是如果你有其他的 SCSI硬盘,这数字将会改变;( 或模拟了SCSI硬盘) 那种情况下,它可能是 /dev/sdb 或一些其他的字母。 如果你的驱动器不能被自动检测到, 就需要进一步采取措施 -- 举例来说,你可能必须打开启动选项使用火线或者PCMCIA接口, 或你可能必须手动装载一些内核模块 , 或其他一类选项。 (资源详见故障发现与维修指导链接)

       ä¸€æ—¦é©±åŠ¨å™¨è¢«è¾¨è®¤å‡ºæ¥ï¼Œå®‰è£…过程种其运作起来就像一个内置的硬盘。然后就你可以对其分区并且用常规方法安装linux。

       æœ‰ä¸€å¥è¯æˆ‘着重要提醒,小心选择何处安装boot loader(通常是GRUB和LILO)--我建议不要装到主引导记录(MBR)中( 通常是默认值) 而是装到外置驱动器的根分区 ( 或/boot分区,如果你单独分了一个话)。

       æ—¢ç„¶æˆ‘们已经安装 Linux 在这个设备上,我们想要从上面启动它。 事情到此开始变的有点复杂了。

       å¯åŠ¨

       åœ¨æˆ‘前讨论在如何的新驱动器上面启动,我要讲解一些boot loader的小知识。

       boot loader程序通常安装在计算机的第一个硬盘的MBR上。 当boot loader被调用 (BIOS自动地运行MBR里的代码),它通常显示一份可启动操作系统的菜单。以便选择一个给定的操作系统启动计算机。

       ä¸¤ä»¶ç»†èŠ‚在这个章节中应该注意:

       * 操作系统选择菜单(通常)从磁盘中载入。

       *为了启动有关的操作系统, boot loader 需要从磁盘中读取相关的内核。

       åœ¨æ“ä½œç³»ç»Ÿè¢«è£…载之前 ,以上各步骤已经执行,这意味着所有的磁盘读取在BIOS调用时。 这是一个必须的前提,即,为了直接启动磁盘,你的 BIOS必须支持通过火线或USB被连接的磁盘。通常能在BIOS中看到关于从这些设备上启动选项。 火线BIOS支持现在的确非常的少见,但是 USB 支持正在变得相当的平常。 因此,如果你正在使用一部相对比较新的计算机上的USB接口,应该可以直接启动驱动器进Linux。

       å½“经由 USB 连接,在安装外部的驱动器的 MBR 的幼虫之后,我能够直接地启动它。 当以被连接的磁盘片启动的时候,只是进入 BIOS 装备公用程序。 外部的磁盘片将会出现如一个一般的硬盘: 移动它,如此它在启动次序中的内在驱动器之前。

       æˆ‘也能够在一个内置的硬盘的MBR上安装一个boot loader而且使用其启动USB硬盘(在GRUB中被成为hd1)。 如果你正在使用火线, 有可能你的 BIOS 将会无法直接地启动硬盘,而且你需要更多一点步骤。

       å¹¸è¿çš„是,由于 Linux 的多样性,这有非常容易解决,如果你不能直接地启动,( 我就是这样的情况,使用一个PCMCIA转接卡!) 你能运行初始启动步骤,来自一个支持的设备 , 像是一台软驱,CD-ROM,USB棒,或在主硬盘上的小分区, 然后使用外部的驱动器继续其他步骤。

       åˆ›å»ºä¸€ä¸ªå¯åŠ¨é•œåƒ

       æˆ‘们有2种方法启动:

       *单阶启动

       å†…核启动, 挂载根分区文件系统, 接着调用初始化教本继续初始化( 通常是/sbin/init)

       *双阶启动 (initrd)的启动

       å†…核启动,挂载一个初始ram disk (initrd),进一步运行定制的初始化, 然后挂载根分区文件系统继续初始化(同样, 通常调用/sbin/init)

       æ¯ç§æ–¹æ³•éƒ½æœ‰å®ƒè‡ªå·±çš„优点和缺点。

       å•é˜¶å¯åŠ¨

       ä¸ºäº†è¦ä½¿ç”¨ä¸€ä¸ªå•é˜¶çš„启动,我们需要建立一个内核包含挂载一个根分区文件系统所需的所有驱动程序。( 任何其他的驱动能作为模块编译并在根分区载入时候进行常规初始化。)

       å¦‚果我们正在从像软盘这样的一个非常小的装置尝试启动, 最好的方式是创建的一个正合适内核,编译进所有挂载根外部分区系统所需驱动 -- 而且编译其他的作为模块。 举例来说,我的内核编译进了SCSI支持, PCMCIA 支持, IEE , SBP ,和其他相似的支持, 但是其他的(包括显卡支持,网络设备支持,等等)当做模块编译并储存在根分区上(在外部的驱动器的),而不是存储在软盘上。

       è¿™ç§æ–¹æ³•çš„主要问题是需要我们给内核源代码打补丁-- 那是一种最糟糕的痛苦(当新的内核发布),而真正的问题是如果补丁没有在维护,这样就不能跟上内核的变化。

       ä½ å¯èƒ½ä»¥ä¸ºå¦‚果计算机BIOS支持USB和火线直接启动,我们能避免发生以上的2个问题。 不幸地,事情不是这样:这一个方法使用BIOS在启动时调用磁盘,一旦内核开始初始化, BIOS就失去了作用,而且使用内核驱动来调用磁盘-- 所以你仍然会碰到同样的问题。

       äºŒé˜¶å¯åŠ¨

       å†…æ ¸2.0.X版本 ,添加了一个有趣的功能到内核 -- 使用“initial RAM disk(初始内存磁盘)”(or initrd)来实现二阶启动。

       ç®€è¨€ä¹‹ï¼Œå†…核一概既往的启动;挂载一个创建在内存里迷你的根分区文件系统取代挂载“真正”的根分区系统。 无论任何命令都在这个初始环境中执行在“真正”的根分区系统被挂载之前直到我们切换到真正的根分区文件系统并销毁初始内存磁盘(initial RAM disk)。

       è¿™ç‚¹åœ¨å„种环境中都非常有用,但是我们的目标仅仅是简单的利用我们的迷你环境去重新扫描SCSI总线,等待外部驱动器识别,然后用它切换到我们真正的根而后继续启动。

       ä½¿ç”¨è¿™ç§æ–¹æ³•ï¼Œæˆ‘们需要创建2个文件,一个内核和一个初始镜像文件。

       å†…核仅是一个内建启动镜像(initrd)支持常规内核。 initrd 镜像是一个包涵我们迷你根分区系统的环路(loopback)文件系统镜像。 (该镜像可以有选折地使用gzip压缩来减小它的大小)。

       ä½ èƒ½åœ¨èµ„源章节里找到关于如何创建和定制你自己的初始镜像的更多信息。

       åœ¨é•œåƒæ–‡ä»¶é‡Œï¼Œæœ‰ä¸€ä¸ªlinuxrc的文件。当镜像给载入时,该文件自动运行,所以请确定其有运行权限!为了达到我们的目的,linuxrc文件非常的简单:

       åˆ—举 1. initrd linuxrc

       #!/bin/sh

       REAL_ROOT=/dev/sda1

       # mount the /proc filesystem

       mount -t proc none /proc

       #for scsi-emulation (SCSI模拟)

       # modprobe sd_mod

       #for pcmcia (PCNCIA卡)

       # modprobe pcmcia_core

       #for FireWire (火线)

       # modprobe ieee

       # modprobe ohci

       # modprobe raw

       # modprobe sbp2

       #for USB (USB)

       # modprobe usbcore

       # modprobe ohci-hcd

       # modprobe uhci-hcd

       # modprobe usb-storage

       # loop rescanning the scsi bus + rerunning devfsd

       retries=5

       i=1

       until [ -e $REAL_ROOT ]

       do

       if [ $i -gt $retries ]

       then

       echo "Unable to mount real root ($REAL_ROOT) - Giving up!"

       /bin/ash

       exit

       fi

       echo "Real root ($REAL_ROOT) not found, retrying ($i)"

       sleep 1

       echo "scsi add-single-device 0 0 0" > /proc/scsi/scsi

       echo "scsi add-single-device 1 0 0" > /proc/scsi/scsi

       echo "scsi add-single-device 2 0 0" > /proc/scsi/scsi

       /bin/devfsd /dev -np

       i=$((i+1))

       done

       #umount /proc as it will be remounted by the normal init process

       ï¼ˆè§£é™¤æŒ‚è½½/proc分区当它会给常规的INIT进程重新挂载)

       umount /proc

       #now we simply exit, and the normal boot process should continue

       ï¼ˆçŽ°åœ¨æˆ‘们可以退出了,常规的启动进程将会继续)

       exit 0

       æˆ‘们正在做的是载入适当的模块去支持外部驱动器: 请按需注视相应行。 (我把所有需要的支持编译进内核,因此不需要模块)。 然后循环, 再扫描 SCSI 总线 (回应一个命令到/proc虚拟文件系统下一个特别文件并调用devfsd程序) 直到根分区设备出现(我的情况是/dev/sda1 )。在我的情况,被访问的火线模拟SCSI总线是1 0 0,但是并不影响尝试部分其他的总线 -- 如果你知道将会使用哪一个,你可以裁减这个教本。 同时, 如果你有其他的 SCSI 设备 (或模拟 SCSI设备), 驱动器可能有一个不同的字母。(例如,/dev/sdb1) 而且如果你没有使用外置驱动器上的第一个分区, 你将会需要使用一个不同的数字。( 例如,/dev/sda2)

       çŽ°åœ¨æˆ‘们需要做的全部是复制相关的文件进initrd镜像.( 你能够使用mount -o loop 命令挂载未压缩的镜像)尤其,我们需要确定我们有 linuxrc 文件、所有被用到的命令和其依赖的库。 这个(未挂载的)镜像可以有选折的压缩。

       å¤åˆ¶å†…æ ¸ (bzImage) 和 initrd 镜像 (initrd.gz)到磁盘。

       æœ€åŽçš„步是在磁盘上安装一个boot loader, 而且用下列的选项启动内核: kernel bzImage root=/dev/sda1 initrd=initrd.gz.

       ä½ çŽ°åœ¨åº”该可以使用磁盘来启动了:它会从软盘中载入内核,载入initrd镜像入内存,然后从那里继续常规启动。这点以后,磁盘就可以拿开了。

       å¦‚果磁盘不合适 ( 例如,计算机没有软驱),任何设备在BIOS能用于启动都可以使用。 个人而言,我就使用一个小小的MB的USB棒来达到这个目的。

       å‚考资料:

       http://www.linuxsir.org/bbs/showthread.php?t=

设计一个用实现串口通信

       数据接收存储技术革新是信号采集处理领域内的一个重要课题。利用这种技术,源码可以把信号的源码实时采集和精确处理在时间上分为两个阶段,有利于获得令人更满意的源码处理结果。在无线数传接收设备中应用数据接收存储方法时,源码除了要满足数据传输速率和差错控制方面的源码游戏保护 源码要求外,还需要考虑如何使设备易于携带、源码接口简单、源码使用方便。源码

       传统外设接口技术不但数据传输速率较低,源码独占中断、源码I/O地址、源码DMA通道等计算机系统关键资源,源码容易造成资源冲突问题,源码而且使用时繁杂的源码安装配置手续也给终端用户带来了诸多不便。近年来,USB接口技术迅速发展,新型计算机纷纷对其提供支持。USB2.0是USB技术发展的最新成果,利用USB2.0接口技术开发计算机外设,不但可以借用其差错控制机制[1][6]减轻开发人员的负担、获得高速数据传输能力(Mb/s),而且可以实现便捷的机箱外即插即用特性,方便终端用户的使用。

       1 无线数传接设备总体构成

       无线数传接收设备是某靶场测量系统的一个重要组成部分。如图1所示,该设备由遥测接收机利用天线接收经过调制的无线电波信号,解调后形成传输速率为4Mb/s的RS-电平差分串行数据流。以帧同步字打头的有效数据帧周期性地出现在这些串行数据中。数据转存系统从中提取出有效的数据帧,并在帧同步字后插入利用GPS接收机生成的eduline源码 java本地时间信息,用于记录该帧数据被接收到的时间,然后送给主机硬件保存。

       在无线数传接收设备中,数据转存系统是实现数据接收存储的关键子系统。下面将详细介绍该系统的硬件实现及工作过程。

       2 数据转存系统基本构成及硬件实现

       数据转存系统主要由FPGA模块、DSP模块、USB2.0接口芯片构成,各个模块之间的相互关系如图2所示示。图中,4Mb/s的串行数据输入信号SDI已由RS-差分电平转换为CMOS电平。为突出重点,不太重要的信号连线未在图中绘出。下面分别介绍这几个模块的主要功能。

       2.1 FPGA模块实现及春功能

       FPGA模块在Altera公司ACEX系列的EP1KTI-2芯片中实现。其中主要的功能子模块有:位同步逻辑、帧同步逻辑、授时时钟和译码逻辑。位同步逻辑主要由数字锁相环构成,用于从串行数据输入信号SDI中恢复出位时钟信号。帧同步逻辑从位同步逻辑的输出信号提取帧同步脉冲。两者为DSP利用其同步串行口接收串行数据作好准备。这样,利用一对差分信号线就可以接收同步串行数据,简化了印制电路板的外部接口。授时时钟在DSP和GSP接收机的协助下生成精度为0.1ms的授时信息。译码逻辑用于实现系统互联。

       2.2 DSP模块实现及其功能

       DSP模块是数据转存系统的主控模块,在T1公司位定点DSP芯片TMSF[4]中实现。在DSP的libyuv源码剖析外部数据空间还配置了KX的高速SRAM,可以缓存余帧数据,用于提高系统的差错控制能力。DSP利用同步串行口接收FPGA送来的同步串行数据,利用异步串口接收GPS接收机送来时间信息(用于初始化FPGA授时时钟),利用外部总线接口访问FPGA授时时钟、外部SRAM、ISP的片内寄存器。可以看出DSP模块主要用于完成数据帧的接收、重组以及转存调度等任务。

        ISP芯片是PHILIPS公司推出的高速USB2.0设备控制器,实现了USB2.0/1.1物理层、协议层,完全符合USB2.0规范,即支持高速(Mb/s)操作,又支持全速(Mb/s)操作。ISP没有内嵌微处理器,但对微处理器操作了灵活的接口。在上电时,通过配置BUS——CONF、DAO、MODE1、MODE0、DA1引脚电平可以适应绝大多数的微处理器接口类型。例如,通过BUS_CONF/DA0引脚,总线配置可以选择普通处理器模块(Generic Phocessor mode)中分割总线模式(Split Bus Mode);在普通处理器模式下,通过MODE0/DA1引脚可以选择读写选通为风格或者Motorola风格。

       在数据转存系统中,ISP用于处理主机的高速数据传输。它工作在普通处理器接口模式下,expma官方源码采用风格的读写选通信号,由DSP芯片TMSF控制。两者在选定工作方式下的信号连线如图3所示,图中未画出的信号引脚可以悬空,供电引脚的连接方式在参考资料[2]第页有简明描述。在FPGA译码逻辑的作用下,ISP的片内寄存器被映射在DSP的片外数据空间中。DSP通过8位地址线选择要访问的寄存器,在读写选通信号的控制下,利用位数据线与选定的寄存器交换数据。在访问ISP单字节寄存器时,数据总线高字节内容无关紧要。ISP通过中断引脚INT向DSP报告发生的总线事件,利用D+、D-引脚完成与主机的数据交换。

       3 数据转存系统的工作过程

       系统加电后,当FPGA配置过程结束时,如果有串行数据输入,位同步逻辑和帧同步逻辑便启动同步过程。同时,DSP片内FLASH中复位中断服务程序c_int0()[4]被立即执行,在建立好C语言的工作环境下,它会调用主函数main()。在main()中,需要安排好一系列有先后顺序的初始化工作。其中,ISP的初始化过程比较复杂,需要考虑设备采用的供电方式(这里为自供电[6]方式)、插接主机和系统上电的先后次序,并需要与USB总线枚举[1][6]过程相结合。最新pj源码

       在FPGA中的位同步逻辑和帧同步逻辑均进入同步状态,且DSP主控模块配合主机完成初始化任务后,即可启动数据的传输过程。下面介绍一下ISP的初始化过程及DSP控制的数据帧的接收机转存流程。

       3.1 ISP的初始化

       在初始化过程中,首先需要设置影响ISP自身工作方式的一些寄存器,然后与主机端USB系统配合进行,应答来自主机端的设备请求。当数据转存系统板作为USB 2.0设备通过连接器连到主机USB根集线器上的一个端口时,主机便可检测到这一连接,接着给该端口加电,检测设备并激活该端口,向USB设备发送复位信号。设备收到这一复位信号后,即进入缺省状态,此后就能够通过缺省通信通道响应主机端送来的设备请求。主机通过描述符请求(GET_DESCRIPTOR)获得设备端的详细信息,通过设置地址请求(SET_ADDRESS)设置设备地址,通过设置配置请求(SET_CONFIGURATION)选定合适的设备配置。在设备成功响应了这些设备请求之后,就可以与主机通信了。

        在响应主机请求的过程中,DSP需要配置ISP的端点以实现不同类型的传输通道。根据数据传输速率的要求,除了缺省的控制通道外,系统中实现了一个批传输(bulk)[1]类型的输入通道。这样,ISP就可以像FIFO一样方便地从数据转存系统向主机传输数据,而且具有差错控制能力,简化了设备端软件设计的复杂性。

       3.2 数据帧的接收转存过程

       系统正常工作时,需要与主机端程序相互配合。主要端需要开发者实现的程序包括设备驱动程序和应用程序。在Windows 操作系统下,USB设备驱动程序为WDM模型的驱动程序,开发环境DriverStudio为WDM型驱动程序提供了框架结构,使得驱动开发变得非常容易(参见参考文献[5]第八、九、十章)。驱动程序接收应用程序的请求,利用USB总线驱动程序(US-BD)和主机控制器驱动程序(HCD)通过主机控制器安排USB总线事务,设备端则根据这些事务调度相应的数据帧的传输。关于主机端口如何安排总线事务可以查阅参考文献[1]。以下着重介绍设备端数据的调度过程。

       数据帧的接收转存过程主要由DSP负责,DSP在外部SRAM中建立了一个数据帧的队列,如图4所示。系统主要工作在中断驱动模式下,与同步串行口相关的中断服务程序负责建立队列的尾部,对应于ISP中断引脚INT的中断服务程序负责建立队列的头部。

       当以帧同步字打头的一帧数据以串行位流的形式到来时,FPGA产生的帧同步脉冲可以直接启动DSP同步串行口接收数据,该同步脉冲同时以中断方式通知DSP为一帧数据的接收做好准备。DSP接到通知后,首先检查外部SRAM中是否有足够的空间容纳一帧数据。如果没有空间,则丢弃当前数据帧(根据设计,这种情况是很少见的);如果有空间,则为当前数据帧保留足够的空间。接着在帧起始位置填写帧步字,读取授时时钟的当前值并填写在帧同步字后。这样,一个新的数据帧(图4中数据帧F_N)就建立了,但是并没有加入到队列中,而是要等待来自同步串行口的后继数据嵌入该帧中后再加入到队列中。

       同步串行口的接收缓冲区在接收到若干字(由初始化时的设置决定)后,会向DSP提出中断请求。在中断服务程序中,DSP读取接收缓冲区中的内容,并将其填入上述新开辟的帧F_N中。在一帧数据接收完毕后,就将该帧添加到队列的尾部,表示该帧数据已经准备好(图4中数据帧F_R),可以通过ISP送给主机硬件保存。

        DSP在查询到队列中有已经准备好的数据帧存在时,就设置ISP的端点索引寄存器(Endpoint Index Register)使其指向初始化时配置的批传输输入端点,然后将队列首帧数据通过ISP的数据端口寄存器(Data Port Register)填写在端点缓冲区中。在端点缓冲区被填满后,它就自动生效。在不能填满端点缓冲区的情况下,可以通过设置控制功能寄存器(Control Function Register)的VENDP位[2]强制该端点缓冲区生效。端点缓冲区生效后,在USB总线上下一IN令牌到来时,该端点缓冲区中的数据就通过USB总线传输到主机中。主机成功接收到数据后,会给ISP以ACK应答。能够通过INT引脚报告给DSP,DSP就可以继续往端点中填写该帧其余数据。

       在队列首帧数据被成功转移到主机后,DSP就丢弃首帧数据。如果队列在还有数据帧,则将次首帧作为首帧,继续前述传输过程;如果没有要传输的数据帧,则为队列首帧指针Head_Ptr赋空值(NULL),等待新的数据帧的到来。

       USB2.0是计算机外设接口技术发展的最新成功,具有广阔的应用前景。本文介绍了PHILIPS公司USB2.0接口芯片ISP在无线数据接收设备中的应用。高性能、便携化的无线数据传接收设备。其在靶场实弹试验中受到了用户的好评。

       PC机的RS-C串行口是使用最多的接口之一。因此,4串口、8串口等以增加串口数量为目的的ISA总线卡产品大量问世。一般串口应用只是使用了RXD和TXD两条传输线和地线所构成的串口的最基本的应用条件,而本文介绍一个利用PC机的RS-串口加上若干电路来实现多串口需求的接口电路。

        1.PC机串口的RTS和DTR及扩展电路

        RTS和DTR是PC机中芯片的MODEM控制寄存器的两个输出引角D1和D0位,口地址为COM1的是3FCH,口地址为COM2的是2FCH。我们可以利用对MODEM控制寄存器3FCH或2FCH的写操作对其进行控制。从而利用该操作和扩展电路实现对TXD和RXD进行多线扩展,图1是其扩展电路。

        在图1所示的PC机串口扩展电路中,LS是二进制计数器,1脚是清0端,2脚是计数端,计数脉冲为负脉冲信号,是八选一双向数字/模拟电子开关电路,其中一片用于正向输出,一片用于反向输出。该扩展电路工作原理是通过控制PC机串口的DTR输出的高低电平来形成LS的P2脚计数端的负脉冲信号,使的输出端P(QA)、P(QB)、P(QC)、P(QD)脚依次在到十六个状态中变化,本电路仅使用了QA、QB、QC三个输出来形成对的ABC控制,最终使得(1)的输入端TXD依次通过与TX1~TX8导通而得到输出信号,(2)的输出端RXD与RX1~RX8依次导通形成输入信号。由于RXD和TXD的导通是一一对应的,因此串口通信就可以依次通过与多达8个带有三线基本串口的外部设备进行通信传输以实现数据传送。PC机端的电平转换电路是将RS电平转换为TTL电平,外设端的电平转换电路是将TTL电平转换为RS电平。由于这种转换有许多电路可以实现,因而,这里不再介绍。

        2.电路使用程序

        对PC机串口COM1的编程如下:

        ……

        … ;对COM1口的波特率等设置;

        MOV DX,3FCH

        MOV AL,XXXXXXB

        OUT DX,AL;D1生成RTS负脉冲,对LS输出端清0

        MOV AL,XXXXXXB;

        OUT DX,AL ;的RX1和TX1导通

        CALL COM ;调用通信子程序,与第一个外部设备通信;

        MOV CX,7 ;设置循环计数器;

        NEXT:MOV DX ,3FCH

        MOV AL,XXXXXXB

        OUT DX ,AL ;D0位生成DTR的负脉冲,形成的P2脚计数脉冲

        MOV AL,XXXXXXB

        OUT DX,AL ;RX2和TX2导通

        CALL COM ;调用通信子程序,与第二个外部设备通信

        LOOP NEXT ;循环与另外6个外部设备通信

        …

        … ;通信子程序略

        3.使用说明

        由于该扩展的多路接口在通信时共用一个子程序,因此在与某一路导通时,系统只能与这一路的外部设备进行通信联络。

        如果工作现场需要立即和某一路通信,则需要对3FCH的D1位执行两个写操作并在RTS脚形成负脉冲,以对I清0后,再连接执行若干次对DTR的两次写操作。例如想对第4路外设通信,则需要执行完成对LS清0后,再连续三次对3FCH的D0位进行两个写操作以形成DTR脚的负脉冲,然后即可调用通信子程序。

        如需使用PC机的COM2串口,只需将程序中的3F8H~3FDH全部换成2F8H~2FDH即可。

        如果使用十六选一双向数字/模拟电子开关电路,可将LS的QA、QB、QC、QD四个输出端接至电子开关的四个控制端A、B、C、D,这样就可以达到一个PC机的RS口与个带有串口的外设的数据通信。

相关栏目:百科