30天自制操作系统吧 关注:1,388贴子:4,988
  • 8回复贴,共1

铁娃娃OS尝试读取SD卡中的文件数据。

只看楼主收藏回复

手头上有一些SD卡,旧的SD卡在2GB以下,还有4GB以上的SDHC卡。笔记本电脑有
SD卡插槽,于是曾经想,试试能不能打通SD卡的读写功能。看了半天书后觉得也很复杂
和困难,估计也要花费不少时间。实在不愿意投入宝贵精力。
后来心机一动,何不利用已经打通的USB功能(部分的功能)去实现呢? 用USB转SD转
换器! 也可以读取SD的数据的。把USB转SD转换器+16GB的SDHC看成一个U盘?
但是,实验一开始就没有任何动作。
只好老老实实按之前采用过的,从“捕捉”EHCI对USB转SD转换器的各个步骤的原始办法
做起。

如果能成功,不就可以读取各种各样储存卡了吗?甚至64GB以上的SDXC卡。
激动~~。
年终大晦日()


IP属地:上海1楼2023-12-31 10:42回复
    捕捉开始,电脑开机→插入USB转SDHC装置→ “捕捉”到的结果如下:
    主机向USB转SDHC转接装置,一共发出了6个SCSI命令。
    OUT 第一个CBW(0x12) INQUIRY DATA FormatInformation
    OUT 第二个CBW(0x00) 查询磁盘Ready命令。
    OUT 第三个CBW(0x03) 查询磁盘状态命令
    OUT 第四个CBW(0x00) 查询磁盘Ready命令。
    OUT 第五个CBW(0x25) Read Capacity Command
    OUT 第六个CBW(0x5A) 向主机传输Mode Sense(10)
    与之前对16GB的U盘捕捉的结果相比,这次多了两个命令。
    除了 CBW(0x00) 查询磁盘Ready命令外,都有从装置那里接收到的数据信息。
    如果有专业的捕捉软件+装置(不知知道具体价格,大概要千元以上吧,b站有
    讲座介绍),那就可以省掉上面的操作。
    从接收到数据信息,可以解析出端点描述符。
    具体解读可以直接用USBView软件(以前提到过),读取该装置的各种描述符。
    我比较了U盘与USB转SDHC转接装置的端点描述符,发现了两者的差异:
    我用的U盘的OUT端点号: 1,IN端点号:2
    我用的USB转SDHC转接装置的的OUT端点号: 2,IN端点号:1
    因为通道的端点号正好颠倒,所以直接用U盘的程序,输出输入的方向都相反了,
    当然是不会正常读取数据的了。
    所以,拿到一个USB装置,先用USBView软件,了解它的特性,是很有帮助的。
    USBView软件是免费使用的,网上找的。
    我修改端点号后,就能正常读到SDHC卡的扇区数据了。另外再根据16GB的SD卡
    的BOOT,FAT1,FAT2,根目录,及每个文件的起始扇区位置,用dir3命令,也正常
    读出了。
    下图是读取到SDHC16GB卡的第一个扇区的内容的电脑截屏:

    从实机电脑上截屏的图像,看起来端端正正,比较舒服。比拍照好看。
    右面的512个字节是BOOT扇区的内容,看到右下角有55AA,就安心了。
    中间是读完一个扇区数据后的QH,qTD留下的现场。
    现在铁娃娃OS可以打开SDHC卡里面的文件了。如gview 1.jpg,mp2
    播放器听音乐,放映有声电影(mpeg1)等。
    从原理上讲读取数据的速度,肯定不如直接要U盘的。但是我实际使用
    的情况看,没有感觉到慢。播放音乐,视频都也正常。
    接下来的任务是挑战一下移动硬盘。从原理上讲其实应该是一样的。
    2023.12.31


    IP属地:上海2楼2023-12-31 12:05
    回复
      2025-06-14 14:53:35
      广告
      我选用3.5英寸机械硬盘,盒子是老式的BUFFALO,它的特点是适配器电源是内置的。
      理论上可以最大选择2TB的硬盘,没有合适的,最后选了500GB的串口硬盘。进行
      格式化,做成FAT32的分区。为了实验简单化,没有用NTFS格式。
      捕捉SCSI命令的过程是相同的,这里省略。
      BOOT: 0扇区
      FAT1: 99扇区
      FAT2: 59709扇区
      根目录: 119319扇区
      首个文件: 119447扇区
      很浪费啊,一个簇单位占了128个扇区,64KB。1TB,2TB就更加浪费。
      BUFFALO移动硬盘盒的OUT端点号:2,IN端点号:1 。
      下面是电脑工作时的屏幕截图:

      正在放映一部黑白反特故事片。当初做mpg解码时,是先考虑黑白Y,然后再考虑CbCr。所
      以选了一部黑白片。截屏留下了少校的英武形象。
      如果用2.5英寸SSD的移动硬盘,情况估计会更好些。毕竟没有机械运动,速度会更快一些。
      铁娃娃OS读取USB大容量存储设备的试验,包括U盘,SD转接器,移动硬盘等告一段落。
      下一步,很想做USB的同步传输的试验。计划放到明年(2024年)吧。
      2023.12.31


      IP属地:上海3楼2023-12-31 21:51
      回复
        手头上还有一个以前用过的MO驱动器,也是USB接口。拿来试试看,效果怎么样。
        MO磁光储存盘,有120MB,230MB,640MB,1300MB几种规格。我这台MO驱动
        器对应最高容量是640GB。手头上的空盘是230MB,就用230MB做测试。

        MO驱动器的读盘速度会更慢。按速度排序,依次为U盘,SD卡,移动硬盘,
        MO光驱,软驱。
        还是按习惯,先测试端点号。 这台驱动器的端点号1:OUT,端点号2:IN。
        注意,即使是同样的USB设备,比如移动硬盘,端点号也不是固定的,是由
        每个厂家自己设定的。所以,实验前必须要先确认OUT,IN两个端点号。
        MO盘按FAT32格式化。
        FAT32 0x0800/簇,2KB
        BOOT:0扇区
        FAT1: 38扇区
        FAT2: 907扇区
        虚拟起始位置:1768扇区
        ROOT:1776扇区
        第一个文件:1780扇区
        230MB的容量的可读写的MO,以前可说是大容量了,可是连一部mpeg1的
        电影都放不下。对比U盘,SD卡,真是隔世物件,大概已经淘汰了吧。
        下面是读取USB-MO驱动器的桌面截图。

        德国人图片,音频文件都是通过USB,从MO盘里读出来的。
        类似的USB设备,如USB接口的DVD-ROM,FDD软驱等。原理是差不多的,就是读写
        的速度不一样吧?
        2024.1.1元旦。


        IP属地:上海4楼2024-01-01 11:16
        回复
          不同容量的U盘,或者不同容量的SD卡的FAT1,FAT2,根目录的位置是不同的。
          之前,我为了节省时间,实验用的U盘经过FAT32格式化后,是借助工具软件WINHEX
          查看该U盘的FAT1等的位置的。
          开始我臆测: 如果U盘的容量确定了,FAT32的格式化后的FAT1,FAT2,根目录
          的位置应该是固定吧·?大概是可以用某个公式计算出来的。
          但我检测了手头上的四种容量U盘之后,它们的FAT1的位置分别为·:4GB是第
          102扇区,8GB是第100扇区,16GB是第100扇区,32GB是第102扇区。明显与
          U盘的容量没有严格的对应关系。FAT2和根目录也同样没有规律可循。臆测失败。
          如果错一个扇区值,后面就不用想Open文件了。
          经过不懈的努力,我通过CBW(0x25)命令,先求得U盘的容量。
          再读取U盘中BOOT区域中的0x1c6中的数值,得到第一基本分区的开始位置,再
          读取第一基本分区的0x24,0x25中的数值,简单计算相加得到FAT1的位置,及FAT
          表的Size。
          上周曾经提到,输出输入端点地址是很关键的参数,如果通讯的方向不对头,就
          根本无法正常通讯的。由于输出输入端点地址1还是2,是USB设备的厂家自己定义
          的,所以要在设备插入“铁娃娃OS”的电脑之后,还必须读取设备的端点描述符。
          端点描述符的获得是通过读取配置描述符时,与配置描述符,接口描述符一起同时
          得到的,一共有0x20个参数。各种获取USB设备的描述符,设置USB设备地址等操
          作,要采用setup传输。 发出的数据一律是DATA0,接收数据一律是DATA1。
          反正USB里面的死规定太多了。我如果不作记录注释,写下来,下周就会忘掉。
          结论,当铁娃娃OS获得U盘的容量,U盘的FAT1,根目录,簇的Size以及端点描
          述符之后,就可以用一个程序对应各种USB大容量设备了,像SD卡,MO驱动器,
          2TB移动硬盘等等。别人的杂牌U盘也能读出文件了。
          附图:
          实机播放电影中的截图。现在可以对应4GB~32GB的U盘了,随插随用。

          SD卡+USB转接器,还没有验证。应该没有大问题了。
          2024.01.07.(应该换一张敬爱的周总_理的照片)


          IP属地:上海5楼2024-01-07 23:23
          回复
            SDHC16GB卡+USB转接器与U盘可以共用一个OS软件实现。
            在SDHC16GB卡+USB转接器插入电脑后,铁娃娃OS读取它的OUT/IN端点地址。计算FAT1和ROOT
            的位置的方法与U盘一样。没有发生意外。
            这是拍摄的实机工作中的照片:

            这是屏幕截屏的图片:

            我还试了插入MO,是不是可以。结果是存储容量显示正确0.23GB,但FAT1,ROOT根目录
            的位置的计算,不能对应。查看MO的BOOT扇区,第一基本分区扇区,内容与U盘不一样,
            现成的计算公式不能直接使用。应该是有另一套的计算公式。网上也没有找到,暂时是用
            winhex查到数值,固化在OS里。
            1.21


            IP属地:上海6楼2024-01-21 20:27
            回复
              当时,最初解码成功的mpeg1的图像,是16x16的像素。

              我当时看到这个比图标还要小的黑白图像,内心很激动。
              因为已经超出我的能力了。这图像别看那么小,而且上面
              的1/4部分还是灰色带子。但我知道图像解码的一道道关卡
              已经打通了。
              下面是解码352x288完全成功的图像:

              后来,又添加YUV转RGB部分,能显示彩色图像了。
              感慨一下。
              1.22


              IP属地:上海7楼2024-01-22 15:09
              回复
                这是视频播放器打开选择菜单的截屏图像:

                存在几个BUG:
                1,视频的菜单中,同一部电影片面,居然重复出现两次。
                2,没有中文对应。
                但这只是支节问题,不是原则问题。
                1.22


                IP属地:上海8楼2024-01-22 15:25
                收起回复