在21IC DIY U盘开发板上实现的SD转USB读卡器(硬件SPI方式)

[复制链接]
10775|30
 楼主| computer00 发表于 2009-4-9 00:58 | 显示全部楼层 |阅读模式
单击此处下载本实验包:<a href="https://bbs.21ic.com/upfiles/img/20094/2009411142312398.rar" target=_blank>https://bbs.21ic.com/upfiles/img/20094/2009411142312398.rar</a><br /><br />本程序使用AT91SAM7S64自带的SPI接口读写SD卡,SPI时钟设置为24MHz。<br />写入速度大约为313KB/s,读出速度大约为272KB/s。<br />程序中没有开启DMA传输,如果开启DMA传输,并使用两个缓冲区轮流操作的话,速度应该会有所提高。<br /><br />另外圈圈想发一下牢骚的是,那个官方的SD卡协议真是TMD又长又臭啊,长一点倒算了,又没逻辑性,<br />写得比较混乱,该清楚的地方交代得不够清楚,不该说的地方又是一堆罗嗦,小日本的文档就是这样的?<br />还好,网上有一些稍微简洁的介绍,让人有一个全局的概念。另外它的命令命名也真是奇怪,居然<br />直接用编号来命名的,我晕,这样鬼记得这个命令是干啥用的……为了简单起见,这个程序并没有<br />启用CRC校验,也没有对写入出错的处理,希望有空的朋友继续完善它吧。<br /><br />图为圈圈使用的32MB&nbsp;SD卡的实验测试结果:<br /><img src="https://bbs.21ic.com/upfiles/img/20094/2009490517935.gif">
armecos 发表于 2009-4-9 01:57 | 显示全部楼层

我也发个在任意开发板上实现的任意介质(如CF/SD)转USB读卡器

硬件SPI方式,very&nbsp;easy!SD卡驱动不用愁。<br /><br />****************************************<br />*&nbsp;在EASYARM2200和SMARTARM2200上实现U盘&nbsp;*<br />****************************************<br />&nbsp;&nbsp;&nbsp;&nbsp;2008/02/01&nbsp;&nbsp;asdjf@163.com&nbsp;&nbsp;www.armecos.com<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;一些《ecos增值包》用户来信要求提供EASYARM2200和SMARTARM2200开发板上的U盘源码,尽管这是一项非常成熟的技术,但网络上几乎没有一份详细完整的文档,大部分范例代码基于查询方式,而且存在比较多的问题,为了方便《ecos增值包》用户深入学习USB技术,我们提供ecos平台上实现的U盘完整源码和详细文档。这份资料不同于网上下载的零散资料,而是专门针对这两款开发板量身打造的,所以使用者可以无障碍地使用它在很短时间内掌握U盘开发技术。同时由于此产品基于ecos平台,用户修改代码和增加功能也易如反掌。<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;简单说,制作U盘需要实现三个方面的内容:1、USB设备驱动;2、存储介质驱动;3、MASS&nbsp;STORAGE大容量存储协议(bulk&nbsp;only&nbsp;+&nbsp;SCSI-2指令集)。至于FAT文件系统,由主机负责管理,U盘设备只需正确响应相应的SCSI-2指令即可。如下图所示:<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;USB设备&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;存储介质<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;主机&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-----------<br />&nbsp;&nbsp;&nbsp;&nbsp;-------------------&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|----RAM<br />&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;USB&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;U盘&nbsp;&nbsp;&nbsp;|----ROM<br />&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;管理FAT文件系统&nbsp;|&lt------&gt|&nbsp;&nbsp;&nbsp;或&nbsp;&nbsp;&nbsp;&nbsp;|----NAND&nbsp;FLASH<br />&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;读卡器&nbsp;&nbsp;|----CF卡<br />&nbsp;&nbsp;&nbsp;&nbsp;------------------&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|----SD卡<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-----------<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt----------------&gt<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;大容量存储协议<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bulk&nbsp;only&nbsp;+&nbsp;SCSI-2<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ecos本身提供了USB设备驱动和多种大容量存储介质驱动,大大减轻了我们的编程负担,我们既可以在RAM上虚拟可读写的U盘,在ROM上实现只读的假U盘,又可以在NAND&nbsp;FLASH上实现真正的U盘,当然,还可以在CF卡和SD卡上实现读卡器功能。<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;----------------------<br />&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;大容量存储介质驱动&nbsp;|<br />&nbsp;&nbsp;&nbsp;&nbsp;----------------------<br />&nbsp;&nbsp;&nbsp;&nbsp;ecos将所有设备抽象为设备文件,我们只要打开相关存储设备,然后读写就可以了,就是这么简单!没有必要再去折腾什么CF/SD卡驱动、ATA、SPI等底层细节,所有不同存储设备的编程界面都是一致的,大大节省了开发时间,当然,如果你对这些驱动感兴趣,《ecos增值包》的其他相关章节有详细文档和源代码说明,这里我们就直接使用设备驱动。<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;首先,打开存储设备文件:<br />&nbsp;&nbsp;&nbsp;&nbsp;cyg_io_lookup(&quot;/dev/hda/&quot;,&nbsp;&cf);&nbsp;&nbsp;//打开CF卡设备驱动,设备文件名为/dev/hda/,句柄保存在cf变量里。<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;如果需要读扇区,就调用块读(bread)函数:<br />&nbsp;&nbsp;&nbsp;&nbsp;cyg_io_bread(cf,&nbsp;buf,&nbsp;&len,&nbsp;pos);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;cf保存已打开设备文件句柄,buf为读出数据缓冲区,len指示读出扇区数(注意不是字节数),pos指示起始位置(注意以扇区为单位)。<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;如果需要写扇区,就调用块写(bwrite)函数:<br />&nbsp;&nbsp;&nbsp;&nbsp;cyg_io_bwrite(cf,&nbsp;buf,&nbsp;&len,&nbsp;pos);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;cf保存已打开设备文件句柄,buf为写入数据缓冲区,len指示写入扇区数(注意不是字节数),pos指示起始位置(注意以扇区为单位)。<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;怎么样,很简单吧!无论什么存储设备,都是“打开---读---写”这三步,就可以读写相应扇区了,根本不用去理会底层的细枝末节,而且接口高度抽象统一,更换一种存储介质仅需要改个设备文件名即可,其余部分一个字也不用动。这也是为什么我们能在很短时间内完成多种存储介质U盘设计的原因,毕竟只需要改个名字,再多存储介质也不怕,依此类推即可。<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;除了操作扇区,SCSI-2指令集还需要设备提供存储器容量(总的扇区数),CHS参数等信息。ecos的设备驱动也已经提供好了相关函数ide_ident()。<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;对于CF卡,设备识别ECH寄存器提供了相关信息:<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />typedef&nbsp;struct&nbsp;ide_identify_data_t_&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;cyg_uint16&nbsp;general_conf;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;00&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;general&nbsp;configuration&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;cyg_uint16&nbsp;num_cylinders;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;01&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;number&nbsp;of&nbsp;cylinders&nbsp;(default&nbsp;CHS&nbsp;trans)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;cyg_uint16&nbsp;reserved0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;02&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;reserved&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;cyg_uint16&nbsp;num_heads;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;03&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;number&nbsp;of&nbsp;heads&nbsp;(default&nbsp;CHS&nbsp;trans)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;cyg_uint16&nbsp;num_ub_per_track;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;04&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;number&nbsp;of&nbsp;unformatted&nbsp;bytes&nbsp;per&nbsp;track&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;cyg_uint16&nbsp;num_ub_per_sector;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;05&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;number&nbsp;of&nbsp;unformatted&nbsp;bytes&nbsp;per&nbsp;sector&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;cyg_uint16&nbsp;num_sectors;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;06&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;number&nbsp;of&nbsp;sectors&nbsp;per&nbsp;track&nbsp;(default&nbsp;CHS&nbsp;trans)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;cyg_uint16&nbsp;num_card_sectors[2];&nbsp;&nbsp;//&nbsp;07-08&nbsp;:&nbsp;number&nbsp;of&nbsp;sectors&nbsp;per&nbsp;card&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;cyg_uint16&nbsp;reserved1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;09&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;reserved&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;cyg_uint16&nbsp;serial[10];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;10-19&nbsp;:&nbsp;serial&nbsp;number&nbsp;(string)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;cyg_uint16&nbsp;buffer_type;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;20&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;buffer&nbsp;type&nbsp;(dual&nbsp;ported)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;cyg_uint16&nbsp;buffer_size;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;21&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;buffer&nbsp;size&nbsp;in&nbsp;512&nbsp;increments&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;cyg_uint16&nbsp;num_ECC_bytes;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;22&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;number&nbsp;of&nbsp;ECC&nbsp;bytes&nbsp;passed&nbsp;on&nbsp;R/W&nbsp;Long&nbsp;cmds&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;cyg_uint16&nbsp;firmware_rev[4];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;23-26&nbsp;:&nbsp;firmware&nbsp;revision&nbsp;(string)<br />&nbsp;&nbsp;&nbsp;&nbsp;cyg_uint16&nbsp;model_num[20];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;27-46&nbsp;:&nbsp;model&nbsp;number&nbsp;(string)<br />&nbsp;&nbsp;&nbsp;&nbsp;cyg_uint16&nbsp;rw_mult_support;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;47&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;max&nbsp;number&nbsp;of&nbsp;sectors&nbsp;on&nbsp;R/W&nbsp;multiple&nbsp;cmds<br />&nbsp;&nbsp;&nbsp;&nbsp;cyg_uint16&nbsp;reserved2;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;48&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;reserved&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;cyg_uint16&nbsp;capabilities;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;49&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;LBA,&nbsp;DMA,&nbsp;IORDY&nbsp;support&nbsp;indicator&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;cyg_uint16&nbsp;reserved3;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;50&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;reserved&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;cyg_uint16&nbsp;pio_xferc_timing;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;51&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;PIO&nbsp;data&nbsp;transfer&nbsp;cycle&nbsp;timing&nbsp;mode&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;cyg_uint16&nbsp;dma_xferc_timing;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;52&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;single&nbsp;word&nbsp;DMA&nbsp;data&nbsp;transfer&nbsp;cycle&nbsp;timing&nbsp;mode&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;cyg_uint16&nbsp;cur_field_validity;&nbsp;&nbsp;&nbsp;//&nbsp;53&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;words&nbsp;54-58&nbsp;validity&nbsp;(0&nbsp;==&nbsp;not&nbsp;valid)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;cyg_uint16&nbsp;cur_cylinders;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;54&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;number&nbsp;of&nbsp;current&nbsp;cylinders&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;cyg_uint16&nbsp;cur_heads;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;55&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;number&nbsp;of&nbsp;current&nbsp;heads&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;cyg_uint16&nbsp;cur_spt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;56&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;number&nbsp;of&nbsp;current&nbsp;sectors&nbsp;per&nbsp;track&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;cyg_uint16&nbsp;cur_capacity[2];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;57-58&nbsp;:&nbsp;current&nbsp;capacity&nbsp;in&nbsp;sectors&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;cyg_uint16&nbsp;mult_sectors;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;59&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;multiple&nbsp;sector&nbsp;setting&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;cyg_uint16&nbsp;lba_total_sectors[2];&nbsp;//&nbsp;60-61&nbsp;:&nbsp;total&nbsp;sectors&nbsp;in&nbsp;LBA&nbsp;mode&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;cyg_uint16&nbsp;sw_dma;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;62&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;single&nbsp;word&nbsp;DMA&nbsp;support&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;cyg_uint16&nbsp;mw_dma;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;63&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;multi&nbsp;word&nbsp;DMA&nbsp;support&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;cyg_uint16&nbsp;apio_modes;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;64&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;advanced&nbsp;PIO&nbsp;transfer&nbsp;mode&nbsp;supported&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;cyg_uint16&nbsp;min_dma_timing;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;65&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;minimum&nbsp;multiword&nbsp;DMA&nbsp;transfer&nbsp;cycle&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;cyg_uint16&nbsp;rec_dma_timing;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;66&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;recommended&nbsp;multiword&nbsp;DMA&nbsp;cycle&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;cyg_uint16&nbsp;min_pio_timing;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;67&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;min&nbsp;PIO&nbsp;transfer&nbsp;time&nbsp;without&nbsp;flow&nbsp;control&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;cyg_uint16&nbsp;min_pio_iordy_timing;&nbsp;//&nbsp;68&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;min&nbsp;PIO&nbsp;transfer&nbsp;time&nbsp;with&nbsp;IORDY&nbsp;flow&nbsp;control&nbsp;<br />//&nbsp;&nbsp;cyg_uint16&nbsp;reserved4[187];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;69-255:&nbsp;reserved&nbsp;<br />}&nbsp;ide_identify_data_t;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;其中cylinders_num,&nbsp;heads_num,&nbsp;sectors_num是我们需要的CHS参数,lba_sectors_num是总容量。只要调用ide_ident()函数,就可以在传回的这个结构体变量里获得相关信息。<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;SD卡与此类似,从CSD和盘信息区里获得相关参数,详见源代码,此处不再赘述。<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;综上,我们实现了任意扇区读写,获得了CHS参数和总容量,OK!做U盘读卡器的信息量已经足够了。下面完成USB设备驱动和SCSI-2协议。<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;---------------<br />&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;USB设备驱动&nbsp;|<br />&nbsp;&nbsp;&nbsp;&nbsp;---------------<br />&nbsp;&nbsp;&nbsp;&nbsp;此处说的USB设备驱动特指D12&nbsp;driver,注意EASYARM2200和SMARTARM2200上都要使用D12&nbsp;PACK小板,《ecos增值包》里已经提供了D12的USB设备驱动,用户需要做的只是提供枚举数据,很简单吧!<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ecos下的D12驱动写得特别专业,不得不佩服ecos社区的专家,他们一直站在最前沿,不断跟踪技术发展,不象我们半路出家,很多事情也许根本就没有意识到,写出的程序,通用性和扩展性跟ecos社区的专家没法比。一般我们用的D12程序都是基于前后台,中断加死循环那种模式的,而ecos充分发挥了OS的特性,一下子提供三种运行模式:1、ISR+DSR模式;2、线程模式;3、轮询POLL模式。ISR+DSR模式能大大减少中断延迟,提高性能指标,我们原来在中断ISR内做所有事情的模式肯定不如在DSR中做大部分工作的中断性能好。前后台采用信号量方式进行同步不会白白浪费CPU时间片。依靠应用程序提供缓冲区而不是采用全局变量缓冲区能大大提高灵活性避免内存拷贝。应用程序不直接调用驱动,而是采用申请功能,完成函数唤醒的方式使用USB设备驱动,思路清晰,能实现流水线作业,减少空等时间。总之,ecos的D12驱动非常有特色,值得学习借鉴,具体使用方法在相关文档里有详细介绍,见《ecos增值包》之USB章节。<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;D12驱动有一些需要特别注意的问题:1、时序问题,因为ARM芯片速度可能比D12读写速度快,所以有必要在某些位置加延时,否则可能读写错数据,某些网上下载的程序使用比较慢的CPU如51,不会遇到此问题;2、D12的主端点采用双缓冲区64*2字节,注意要等待一段时间等双缓冲区填满后再访问,否则可能出现多读64字节或少读64字节的现象。有些网上下载的程序没有采用中断方式,不会遇到此问题;3、结构体定义要加“__attribute__((packed))”属性,否则得到的结构体不是紧凑的,可能为字节对齐加入了多余字节。<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;下面让我们用实际程序来解释一下如何写ecos下的USB设备驱动。<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ecos采用一种非常灵活的方式组织枚举数据,一个枚举数据结构体包含了接口、端点、字符串的总数量,设备、配置、接口、端点、字符串的结构体信息。一个USB设备只有一个设备描述符,可能有多个配置描述符,所以,把接口、端点、字符串描述符存放在数组里,用指针指示,同时分别记录接口、端点、字符串描述符的个数。配置描述符也存放在数组里,不过不用记录个数,由应用程序负责解释。<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />usb_configuration_descriptor&nbsp;usb_configuration&nbsp;=&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;length:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;USB_CONFIGURATION_DESCRIPTOR_LENGTH,<br />&nbsp;&nbsp;&nbsp;&nbsp;type:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;USB_CONFIGURATION_DESCRIPTOR_TYPE,<br />&nbsp;&nbsp;&nbsp;&nbsp;total_length_lo:&nbsp;&nbsp;&nbsp;&nbsp;0x2E,<br />&nbsp;&nbsp;&nbsp;&nbsp;total_length_hi:&nbsp;&nbsp;&nbsp;&nbsp;0,<br />&nbsp;&nbsp;&nbsp;&nbsp;number_interfaces:&nbsp;&nbsp;1,<br />&nbsp;&nbsp;&nbsp;&nbsp;configuration_id:&nbsp;&nbsp;&nbsp;1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;id&nbsp;0&nbsp;is&nbsp;special&nbsp;according&nbsp;to&nbsp;the&nbsp;spec<br />&nbsp;&nbsp;&nbsp;&nbsp;configuration_str:&nbsp;&nbsp;0,<br />&nbsp;&nbsp;&nbsp;&nbsp;attributes:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x60,<br />&nbsp;&nbsp;&nbsp;&nbsp;max_power:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x32<br />};<br /><br />usb_interface_descriptor&nbsp;usb_interface&nbsp;=&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;length:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;USB_INTERFACE_DESCRIPTOR_LENGTH,<br />&nbsp;&nbsp;&nbsp;&nbsp;type:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;USB_INTERFACE_DESCRIPTOR_TYPE,<br />&nbsp;&nbsp;&nbsp;&nbsp;interface_id:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,<br />&nbsp;&nbsp;&nbsp;&nbsp;alternate_setting:&nbsp;&nbsp;0,<br />&nbsp;&nbsp;&nbsp;&nbsp;number_endpoints:&nbsp;&nbsp;&nbsp;4,<br />&nbsp;&nbsp;&nbsp;&nbsp;interface_class:&nbsp;&nbsp;&nbsp;&nbsp;0x08,<br />&nbsp;&nbsp;&nbsp;&nbsp;interface_subclass:&nbsp;0x06,<br />&nbsp;&nbsp;&nbsp;&nbsp;interface_protocol:&nbsp;0x50,<br />&nbsp;&nbsp;&nbsp;&nbsp;interface_str:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0<br />};<br /><br />usb_endpoint_descriptor&nbsp;usb_endpoints[USBTEST_MAX_ENDPOINTS]&nbsp;=&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x07,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x05,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x81,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x03,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x10,&nbsp;0x00,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x0a<br />&nbsp;&nbsp;&nbsp;&nbsp;},<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x07,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x05,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x01,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x03,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x10,&nbsp;0x00,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x0a<br />&nbsp;&nbsp;&nbsp;&nbsp;},<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x07,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x05,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x82,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x02,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x40,&nbsp;0x00,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00<br />&nbsp;&nbsp;&nbsp;&nbsp;},<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x07,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x05,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x02,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x02,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x40,&nbsp;0x00,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x0a<br />&nbsp;&nbsp;&nbsp;&nbsp;},<br />};<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />const&nbsp;unsigned&nbsp;char*&nbsp;usb_strings[]&nbsp;=&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&quot;04031104&quot;,&nbsp;&nbsp;//4&nbsp;3&nbsp;9&nbsp;4<br />&nbsp;&nbsp;&nbsp;&nbsp;&quot;120332003000370031003000390038003200&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;&quot;2003R00e00d00&nbsp;00H00a00t00&quot;,<br />&nbsp;&nbsp;&nbsp;&nbsp;&quot;5403R00e00d00&nbsp;00H00a00t00&nbsp;00e00C00o00s00&nbsp;00&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;&quot;U00S00B00&nbsp;00t00e00s00t00&quot;<br />};<br /><br />usbs_enumeration_data&nbsp;usb_enum_data&nbsp;=&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;length:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;USB_DEVICE_DESCRIPTOR_LENGTH,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;USB_DEVICE_DESCRIPTOR_TYPE,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;usb_spec_lo:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;USB_DEVICE_DESCRIPTOR_USB11_LO,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;usb_spec_hi:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;USB_DEVICE_DESCRIPTOR_USB11_HI,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;device_class:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;device_subclass:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;device_protocol:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max_packet_size:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;16,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vendor_lo:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x71,&nbsp;&nbsp;&nbsp;//&nbsp;Note:&nbsp;this&nbsp;is&nbsp;not&nbsp;an&nbsp;allocated&nbsp;vendor&nbsp;id<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vendor_hi:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x04,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;product_lo:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xf0,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;product_hi:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xff,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;device_lo:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x01,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;device_hi:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;manufacturer_str:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;product_str:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;serial_number_str:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;number_configurations:&nbsp;&nbsp;1<br />&nbsp;&nbsp;&nbsp;&nbsp;},<br />&nbsp;&nbsp;&nbsp;&nbsp;total_number_interfaces:&nbsp;&nbsp;&nbsp;&nbsp;1,<br />&nbsp;&nbsp;&nbsp;&nbsp;total_number_endpoints:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4,<br />&nbsp;&nbsp;&nbsp;&nbsp;total_number_strings:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3,<br />&nbsp;&nbsp;&nbsp;&nbsp;configurations:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&usb_configuration,<br />&nbsp;&nbsp;&nbsp;&nbsp;interfaces:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&usb_interface,<br />&nbsp;&nbsp;&nbsp;&nbsp;endpoints:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;usb_endpoints,<br />&nbsp;&nbsp;&nbsp;&nbsp;strings:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;usb_strings<br />};<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;......<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;control_endpoint-&gtenumeration_data&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;&usb_enum_data;<br />&nbsp;&nbsp;&nbsp;&nbsp;usbs_start(control_endpoint);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;如上所示,先准备出配置、接口、端点、字符串的结构体信息,再按上面写法准备出枚举数据(内含设备信息),各字段含义请读者自行对照协议解释。在主程序里填好枚举数据结构体地址,然后调用usbs_start()函数启动USB设备驱动即可。复杂的D12驱动细节完全由ecos代劳了,只需要用户准备好枚举数据,实现ecos下的USB设备驱动就是如此地简单明了!用户完全没有必要做那些重复工作,把精力集中到有价值的事情上。<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;------------------------------<br />&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;bulk&nbsp;only&nbsp;+&nbsp;SCSI-2协议实现&nbsp;|<br />&nbsp;&nbsp;&nbsp;&nbsp;------------------------------<br />&nbsp;&nbsp;&nbsp;&nbsp;完成上面步骤后,U盘还不能被正确枚举,因为bulk&nbsp;only中有两种类特定请求命令需要响应:1、mass&nbsp;storage复位;2、获取最大逻辑单元号。<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;这可难不倒ecos的USB设备驱动。大家知道,设备请求类型分为四种:1、标准;2、类;3、厂商;4、其他。ecos里巧妙地实现了这四种类型的驱动。首先ecos提供标准请求的通用缺省处理,一般不用改动,因为所有USB设备都是应该这样处理的。当然如果用户有特殊要求,也可以替换掉ecos本身提供的缺省处理函数。对于其他三种类型,ecos自然不知道该如何处理,但它提供了通用程序框架,用户只需提供相应请求类型的处理回调函数和数据即可。<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />usbs_control_return&nbsp;yy_class_ctl_fn(struct&nbsp;usbs_control_endpoint*&nbsp;endp,&nbsp;void*&nbsp;data)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;usbs_control_return&nbsp;result&nbsp;=&nbsp;USBS_CONTROL_RETURN_UNKNOWN;<br />&nbsp;&nbsp;&nbsp;&nbsp;usb_devreq*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;req&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;(usb_devreq*)&nbsp;endp-&gtcontrol_buffer;<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;length;<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;direction;<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;recipient;<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ch;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;length&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;(req-&gtlength_hi&nbsp;&lt&lt&nbsp;8)&nbsp;|&nbsp;req-&gtlength_lo;<br />&nbsp;&nbsp;&nbsp;&nbsp;direction&nbsp;&nbsp;&nbsp;=&nbsp;req-&gttype&nbsp;&&nbsp;USB_DEVREQ_DIRECTION_MASK;<br />&nbsp;&nbsp;&nbsp;&nbsp;recipient&nbsp;&nbsp;&nbsp;=&nbsp;req-&gttype&nbsp;&&nbsp;USB_DEVREQ_RECIPIENT_MASK;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//在DSR里不能使用printf函数,否则死机。<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//GET&nbsp;MAX&nbsp;LUN<br />&nbsp;&nbsp;&nbsp;&nbsp;if((req-&gttype&nbsp;==&nbsp;0xA1)&nbsp;&&&nbsp;(req-&gtrequest&nbsp;==&nbsp;0xFE)){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;endp-&gtcontrol_buffer[0]&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;endp-&gtbuffer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;endp-&gtcontrol_buffer;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;endp-&gtbuffer_size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;endp-&gtfill_buffer_fn&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;(void&nbsp;(*)(usbs_control_endpoint*))&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;endp-&gtcomplete_fn&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;(usbs_control_return&nbsp;(*)(usbs_control_endpoint*,&nbsp;cyg_bool))&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;=&nbsp;USBS_CONTROL_RETURN_HANDLED;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;//Mass&nbsp;Storage&nbsp;Reset<br />&nbsp;&nbsp;&nbsp;&nbsp;if((req-&gttype&nbsp;==&nbsp;0x21)&nbsp;&&&nbsp;(req-&gtrequest&nbsp;==&nbsp;0xFF)){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;=&nbsp;USBS_CONTROL_RETURN_HANDLED;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;result;<br />}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;......<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;ep0-&gtclass_control_fn&nbsp;=&nbsp;yy_class_ctl_fn;<br />&nbsp;&nbsp;&nbsp;&nbsp;ep0-&gtclass_control_data&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;如上所示,在类请求回调函数里实现了GET&nbsp;MAX&nbsp;LUN和Mass&nbsp;Storage&nbsp;Reset两个特定类请求命令。GET&nbsp;MAX&nbsp;LUN回应0表示设备上只有一个逻辑单元。特别注意在这个回调函数里不能使用printf函数,因为此回调函数要在DSR上下文中运行,不能使用printf函数。<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;接下来要实现SCSI-2指令集,其实也没什么难度,就是回应请求罢了,都是些按部就班的重复劳动,可以用bus&nbsp;hound抓一个U盘的响应过程,然后照着实现即可。具体过程最好看源码,一目了然。这里大致介绍一下程序结构:<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;usbs_start_rx_buffer(endpoint_rx,&nbsp;buf[buf_flag],&nbsp;512,&nbsp;&test_callback,&nbsp;(void*)&nbsp;&test);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(cbw-&gtdCBWSignature!=0x43425355){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;diag_printf(&quot;CBW&nbsp;error!
&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Return_CSW(0x00,FAIL,endpoint_tx);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;if(cbw-&gtbmCBWFlags&0x80){//IN<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch(cbw-&gtCBWCB[0]){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Read_10&nbsp;:&nbsp;......<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Inquiry&nbsp;:&nbsp;......<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Read_Capacity&nbsp;:&nbsp;......<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;&nbsp;Read_Format_capacity&nbsp;:&nbsp;......<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Request_Sense&nbsp;:&nbsp;......<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Medium_Removal&nbsp;:&nbsp;......<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Mode_Sense&nbsp;:&nbsp;......<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;......<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;else{//OUT<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch(cbw-&gtCBWCB[0]){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Write_10&nbsp;:&nbsp;......<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Test_Unit_Ready&nbsp;:&nbsp;......<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Verify&nbsp;:&nbsp;......<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;......<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;由上可知,先接收有效CBW命令,然后区分传输方向,根据命令选取不同处理分支,处理结束发送CSW。其中完成各个命令的处理就实现了SCSI-2指令集。下面举例说明Read_10的实现:<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Read_10&nbsp;:&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//pos为起始块号,len为块数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pos&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt&nbsp;4;&nbsp;i++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pos&nbsp;&lt&lt=&nbsp;8;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pos&nbsp;+=&nbsp;cbw-&gtCBWCB[2+i];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;len&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;len&nbsp;+=&nbsp;cbw-&gtCBWCB[7];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;len&nbsp;&lt&lt=&nbsp;8;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;len&nbsp;+=&nbsp;cbw-&gtCBWCB[8];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tlen&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt&nbsp;len;&nbsp;i++){//读出CF卡的某个扇区并发送出去,最后发送CSW。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cyg_io_bread(cf,&nbsp;&secbuf,&nbsp;&tlen,&nbsp;(pos&nbsp;+&nbsp;i));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;usbs_start_tx_buffer(endpoint_tx,&nbsp;(unsigned&nbsp;char&nbsp;*)(secbuf),&nbsp;512,&nbsp;&test_callback,&nbsp;(void*)&nbsp;&test);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cyg_semaphore_wait(&(test.sem));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Return_CSW(0x00,SUCCESS,endpoint_tx);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//printf(&quot;Read_10
&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;其他命令处理与此类似,详见源程序。<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;注意:Inquiry命令的响应数据必须正确才能被允许格式化,有些网上代码的数据信息是不正确的,如果拿来就用可能导致无法格式化。如果没有把设备标明为可移动设备,主机就不会不断探测设备是否在位。好多不正常现象其实不是程序的错,而是数据配置错,犯这种错误实在太冤枉了。不过本程序是经过实际测试成功的,拿来就可以使用,改动也很容易,配置数据确保没有问题,请放心使用!本程序加上注释才700多行,如此短的程序就能完整实现U盘格式化、读写等功能,思路特别清晰,这说明《ecos增值包》确实是一个非常有效的快速验证平台,用它来学习也是不错的选择。《ecos增值包》用户可以得到相关源码和文档,所有人都可以免费下载演示版本以及此文档。把你的EASYARM2200和SMARTARM2200开发板改造成U盘/读卡器吧,这样又多了一个实用工具。<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;另外,如果对读U盘的主机感兴趣,请看“《ecos增值包》之USB&nbsp;HOST驱动篇”,里面详细介绍了USB&nbsp;HOST协议栈框架,是一个通用的USB主机实现,不光U盘,HID键盘鼠标,HUB驱动等都包括了,还可以方便地增加新的协议驱动。
armecos 发表于 2009-4-9 01:57 | 显示全部楼层

SPI驱动程序设计

*******************<br />*&nbsp;SPI驱动程序设计&nbsp;*<br />*******************<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2007/09/17&nbsp;&nbsp;asdjf@163.com&nbsp;&nbsp;www.armecos.com<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;《ecos增值包》设备驱动层DEV提供了SMARTARM2200的SPI驱动,这个驱动抽象出了SPI的本质特征,其接口函数可以通用在各种带SPI的硬件平台上。此处,我们使用这个SPI驱动访问SD卡,减少了工作量,增加了移植性。下面让我们从总体上来了解这个通用SPI设备驱动的设计理念。<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;设计目标:灵活设定工作模式(查询/中断),广泛适应各种硬件平台和SPI变种,高效率的万能SPI驱动程序。<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;SPI(串行外围设备接口)属于一系列串行总线技术之一。它能够将处理器和一个或多个外围设备连接起来。例如:AD转换器或者RTC实时钟,只需要很少的引脚和PCB走线。这项技术最初是由Motorola提供的,现在也获得了其他供应商的支持。<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;一个典型的SPI系统如图所示:图1<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;在数据传输开始,主机有效其中一个片选信号然后产生时钟信号。在每个时钟周期,主机在“主出从入”线输出一比特,同时在“主入从出”线输入一比特。每个设备都连接到一个时钟线、2个数据线和它们自己的片选线。如果片选无效,那么设备将忽略任何到达的数据并使输出保持三态。反之,在每一个时钟周期输入和输出一比特。<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;主机和设备之间利用SPI总线可以在同一时间交换大量数据。一些设备是单向的,例如:LED设备只能接收主机发来的数据,但不能反馈任何有意义的信息。此时,主机仍然会继续接收输入数据,然后抛弃。<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;SPI一个有用的特点是没有从设备到主机的流控。如果主机试图和一个当前不存在的设备通信,如:MMC没有插在插槽上,那么也可以照常运行,只不过读到的是随机数据罢了。典型地,软件级别的CRC校验或者类似技术可以使主机察觉出此类错误。<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;SPI操作没有完全标准化,一些设备间的差异如下:<br />&nbsp;&nbsp;&nbsp;&nbsp;1、许多设备的传输单位是8bit字节,也有些设备使用16bit;<br />&nbsp;&nbsp;&nbsp;&nbsp;2、片选可能是高有效或者低有效。如果混合使用不同片选有效极性的设备,那么将会使事情变得复杂;<br />&nbsp;&nbsp;&nbsp;&nbsp;3、时钟支持各种速率,从128K到20MHz或者更高。某些设备需要先用低速通信,然后获得时钟信息,再选择一个更高速率用于后续传输;<br />&nbsp;&nbsp;&nbsp;&nbsp;4、数据传输之间,时钟无效。无效的时钟极性可能为高,也可能为低;<br />&nbsp;&nbsp;&nbsp;&nbsp;5、数据可以在上升沿或者下降沿采样;<br />&nbsp;&nbsp;&nbsp;&nbsp;6、一个设备可能需要额外的延时,例如:在片选有效和第一个时钟周期之间;<br />&nbsp;&nbsp;&nbsp;&nbsp;7、某些设备包括若干个复杂的传输阶段,要求片选一直有效,这样就不能在传输间隙和其他设备进行快速通信了;<br />&nbsp;&nbsp;&nbsp;&nbsp;8、一些设备,如MMC卡,在传输结束,片选无效的情况下仍然需要时钟,以便完成设备内部的某些操作。<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;主机内部的时钟和数据信号通常使用专用硬件实现。替代的方案可以是bit-banging,那是其他串行总线技术经常使用的,如I2C。片选也可以使用专用硬件实现,但通常是由GPIO代劳。<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;一个SPI传输包括以下阶段:<br />&nbsp;&nbsp;&nbsp;&nbsp;1、在线程级别上锁定总线,确保同一时间只有一个线程在访问SPI总线。<br />&nbsp;&nbsp;&nbsp;&nbsp;2、有效设备片选,收发数据。可能是一次传输,也可能是一系列传输。在一系列传输期间,片选保持有效不是必须的。<br />&nbsp;&nbsp;&nbsp;&nbsp;3、可选的,在片选无效后继续产生一些时钟,用于某些设备完成操作。<br />&nbsp;&nbsp;&nbsp;&nbsp;4、解除总线锁定,允许其他线程在连接到这个总线上的设备上执行SPI操作。<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;举例:<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;#include&nbsp;&ltcyg/io/spi.h&gt<br />&nbsp;&nbsp;&nbsp;&nbsp;#include&nbsp;&ltcyg/hal/hal_io.h&gt&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Defines&nbsp;the&nbsp;SPI&nbsp;devices<br />&nbsp;&nbsp;&nbsp;&nbsp;...<br />&nbsp;&nbsp;&nbsp;&nbsp;//SPI传输开始:在线程级别上锁定总线<br />&nbsp;&nbsp;&nbsp;&nbsp;cyg_spi_transaction_begin(&hal_spi_eprom);<br />&nbsp;&nbsp;&nbsp;&nbsp;//基于中断模式的传输,发送4字节命令<br />&nbsp;&nbsp;&nbsp;&nbsp;cyg_spi_transaction_transfer(&hal_spi_eprom,&nbsp;0,&nbsp;4,&nbsp;command,&nbsp;NULL,&nbsp;0);<br />&nbsp;&nbsp;&nbsp;&nbsp;//读回状态字节<br />&nbsp;&nbsp;&nbsp;&nbsp;cyg_spi_transaction_transfer(&hal_spi_eprom,&nbsp;0,&nbsp;1,&nbsp;NULL,&nbsp;status,&nbsp;0);<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!status[0])&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//命令响应失败,产生额外的时钟<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cyg_spi_transaction_tick(&hal_spi_eprom,&nbsp;0,&nbsp;1);<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//传输数据,读回最终状态。然后无效片选<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cyg_spi_transaction_transfer(&hal_spi_eprom,&nbsp;0,&nbsp;n,&nbsp;data,&nbsp;NULL,&nbsp;0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cyg_spi_transaction_transfer(&hal_spi_eprom,&nbsp;0,&nbsp;2,&nbsp;NULL,&nbsp;status,&nbsp;1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//检测最终状态码的代码放这里<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;//传输完成<br />&nbsp;&nbsp;&nbsp;&nbsp;cyg_spi_transaction_end(&hal_spi_eprom);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;函数原型:<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />//SPI数据传输,支持查询/中断模式设定,在发数据同时接收数据,如果接收缓冲为NULL,则直接抛弃接收到的数据。支持一次发送多个数据。<br />void&nbsp;cyg_spi_transfer(cyg_spi_device*&nbsp;device,&nbsp;cyg_bool&nbsp;polled,&nbsp;cyg_uint32&nbsp;count,&nbsp;const&nbsp;cyg_uint8*&nbsp;tx_data,&nbsp;cyg_uint8*&nbsp;rx_data);<br /><br />//SPI时钟发送,片选无效。<br />void&nbsp;cyg_spi_tick(cyg_spi_device*&nbsp;device,&nbsp;cyg_bool&nbsp;polled,&nbsp;cyg_uint32&nbsp;count);<br /><br />//获得当前SPI时钟配置值<br />int&nbsp;cyg_spi_get_config(cyg_spi_device*&nbsp;device,&nbsp;cyg_uint32&nbsp;key,&nbsp;void*&nbsp;buf,&nbsp;cyg_uint32*&nbsp;len);<br /><br />//设置当前SPI时钟配置值,并备份旧值。<br />int&nbsp;cyg_spi_set_config(cyg_spi_device*&nbsp;device,&nbsp;cyg_uint32&nbsp;key,&nbsp;const&nbsp;void*&nbsp;buf,&nbsp;cyg_uint32*&nbsp;len);<br /><br />//SPI传输开始。<br />void&nbsp;cyg_spi_transaction_begin(cyg_spi_device*&nbsp;device);<br /><br />//非阻塞SPI传输开始。<br />cyg_bool&nbsp;cyg_spi_transaction_begin_nb(cyg_spi_device*&nbsp;device);<br /><br />//SPI数据传输,支持查询/中断模式设定,在发数据同时接收数据,如果接收缓冲为NULL,则直接抛弃接收到的数据。支持一次发送多个数据。支持传输完成后的片选设置。<br />void&nbsp;cyg_spi_transaction_transfer(cyg_spi_device*&nbsp;device,&nbsp;cyg_bool&nbsp;polled,&nbsp;cyg_uint32&nbsp;count,&nbsp;const&nbsp;cyg_uint8*&nbsp;tx_data,&nbsp;cyg_uint8*&nbsp;rx_data,&nbsp;cyg_bool&nbsp;drop_cs);<br /><br />//SPI时钟发送。<br />void&nbsp;cyg_spi_transaction_tick(cyg_spi_device*&nbsp;device,&nbsp;cyg_bool&nbsp;polled,&nbsp;cyg_uint32&nbsp;count);<br /><br />//SPI传输结束。<br />void&nbsp;cyg_spi_transaction_end(cyg_spi_device*&nbsp;device);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;说明:<br />&nbsp;&nbsp;&nbsp;&nbsp;以上这些函数抽象了SPI传输的本质,涉及到时钟速率、设置片选、传输数据、传输过程、多线程临界控制、工作模式设定、多总线驱动等内容,完整地概括了SPI的操作内容,适应性非常强,可以用在各种硬件平台上并保持接口函数不变。<br />&nbsp;&nbsp;&nbsp;&nbsp;SPI传输可以基于查询模式或者中断模式。一般在系统初始化阶段和单线程(如:redboot)里使用查询模式,多线程应用最好使用中断模式,因为这样能更有效地使用CPU,避免循环等待传输结束浪费时间。<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;cyg_spi_device*&nbsp;device&nbsp;&nbsp;&nbsp;&nbsp;设备标识,用于区分多个SPI总线设备。<br />&nbsp;&nbsp;&nbsp;&nbsp;cyg_bool&nbsp;polled&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;模式选择:查询模式,中断模式<br />&nbsp;&nbsp;&nbsp;&nbsp;cyg_uint32&nbsp;count&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;传输数据数目<br />&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;cyg_uint8*&nbsp;tx_data&nbsp;&nbsp;待发送的数据缓冲区<br />&nbsp;&nbsp;&nbsp;&nbsp;cyg_uint8*&nbsp;rx_data&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;接收数据缓冲区<br />&nbsp;&nbsp;&nbsp;&nbsp;cyg_bool&nbsp;drop_cs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是否在结束时无效片选
armecos 发表于 2009-4-9 02:04 | 显示全部楼层

SD卡驱动测试

********************<br />*&nbsp;SD卡驱动程序设计&nbsp;*<br />********************<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;------《ecos增值包》之SD卡驱动<br />&nbsp;&nbsp;&nbsp;&nbsp;2006/09/17&nbsp;&nbsp;&nbsp;asdjf@163.com&nbsp;&nbsp;www.armecos.com<br /><br />------------<br />SD卡驱动测试<br />------------<br /><br />SmartARM2200平台<br /><br />一张512M的SD卡,格式化成FAT32,创建两个文本文件:<br />a.txt<br />&nbsp;&nbsp;&nbsp;&nbsp;1234567890<br />b.txt<br />&nbsp;&nbsp;&nbsp;&nbsp;abcdefghijklmn<br />用winhex软件分析,FAT1位于32扇区,a.txt文件位于1980扇区,b.txt文件位于1988扇区,当然启动部分就固定在0扇区。<br />下面是用SD卡驱动读出的识别信息CID、CSD、0扇区数据、32扇区数据、1980扇区数据、1988扇区数据,和winhex的数据对比,完全一致。<br /><br />SD卡先关电源再打开,初始化硬件,检测卡是否插入,接着发送复位命令、激活初始化处理命令、读取并解析CID、读取并解析CSD、设置SPI时钟为最大值、设置读写块长度。(其他如OCR、SCR、CRC校验等省略。)每个命令都给出了命令、参数、应答信息,同时给出编码封装后的字节序。每个命令都超时等待应答成功,有写命令的应答带有返回数据。<br /><br />SD卡测试程序分析了MBR信息,准确读出了几个特定扇区的数据。接着向指定的100扇区强制写入固定数据,再读出来,结果数据一致。在完成写入命令后,还需要等待数据写入完成,写入扇区需要相对比较长的时间,这里使用忙等待模式(更快的可以使用异步模式,完成写命令后先处理其他任务,不必一直等待写数据完成)。<br /><br />经测试,寄存器读、数据读写均正确完成。<br /><br />test&nbsp;by&nbsp;yangyi<br />2007/09/17<br /><br />+<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*******************************<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SD&nbsp;Card&nbsp;Test&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*******************************<br /><br />Power&nbsp;down!<br />Power&nbsp;up!<br /><br />Card&nbsp;insert<br /><br />Request&nbsp;40&nbsp;00&nbsp;00&nbsp;00&nbsp;00&nbsp;95&nbsp;ff<br />Sent&nbsp;command&nbsp;cmd&nbsp;=&nbsp;00&nbsp;arg&nbsp;=&nbsp;0:&nbsp;reply&nbsp;bytes&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff<br />&nbsp;&nbsp;loop&nbsp;0,&nbsp;additional&nbsp;reply&nbsp;01<br />Request&nbsp;41&nbsp;00&nbsp;00&nbsp;00&nbsp;00&nbsp;ff&nbsp;ff<br />Sent&nbsp;command&nbsp;cmd&nbsp;=&nbsp;01&nbsp;arg&nbsp;=&nbsp;0:&nbsp;reply&nbsp;bytes&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff<br />&nbsp;&nbsp;loop&nbsp;0,&nbsp;additional&nbsp;reply&nbsp;01<br />Request&nbsp;41&nbsp;00&nbsp;00&nbsp;00&nbsp;00&nbsp;ff&nbsp;ff<br />Sent&nbsp;command&nbsp;cmd&nbsp;=&nbsp;01&nbsp;arg&nbsp;=&nbsp;0:&nbsp;reply&nbsp;bytes&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff<br />&nbsp;&nbsp;loop&nbsp;0,&nbsp;additional&nbsp;reply&nbsp;01<br />Request&nbsp;41&nbsp;00&nbsp;00&nbsp;00&nbsp;00&nbsp;ff&nbsp;ff<br />Sent&nbsp;command&nbsp;cmd&nbsp;=&nbsp;01&nbsp;arg&nbsp;=&nbsp;0:&nbsp;reply&nbsp;bytes&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff<br />&nbsp;&nbsp;loop&nbsp;0,&nbsp;additional&nbsp;reply&nbsp;01<br />Request&nbsp;41&nbsp;00&nbsp;00&nbsp;00&nbsp;00&nbsp;ff&nbsp;ff<br />Sent&nbsp;command&nbsp;cmd&nbsp;=&nbsp;01&nbsp;arg&nbsp;=&nbsp;0:&nbsp;reply&nbsp;bytes&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff<br />&nbsp;&nbsp;loop&nbsp;0,&nbsp;additional&nbsp;reply&nbsp;01<br />Request&nbsp;41&nbsp;00&nbsp;00&nbsp;00&nbsp;00&nbsp;ff&nbsp;ff<br />Sent&nbsp;command&nbsp;cmd&nbsp;=&nbsp;01&nbsp;arg&nbsp;=&nbsp;0:&nbsp;reply&nbsp;bytes&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff<br />&nbsp;&nbsp;loop&nbsp;0,&nbsp;additional&nbsp;reply&nbsp;00<br />Request&nbsp;4a&nbsp;00&nbsp;00&nbsp;00&nbsp;00&nbsp;ff&nbsp;ff<br />Sent&nbsp;command&nbsp;cmd&nbsp;=&nbsp;0a&nbsp;arg&nbsp;=&nbsp;0:&nbsp;reply&nbsp;bytes&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff<br />&nbsp;&nbsp;loop&nbsp;0,&nbsp;additional&nbsp;reply&nbsp;00<br />mmc_spi_read_data():&nbsp;got&nbsp;data&nbsp;and&nbsp;CRC&nbsp;4a&nbsp;36<br /><br /><br />CID&nbsp;data:&nbsp;27&nbsp;50&nbsp;48&nbsp;53&nbsp;44&nbsp;35&nbsp;31&nbsp;32&nbsp;11&nbsp;21&nbsp;f0&nbsp;56&nbsp;01&nbsp;00&nbsp;68&nbsp;ab<br />CID&nbsp;data:&nbsp;register<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;Manufacturer&nbsp;ID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;MID&nbsp;=&nbsp;0x27<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;OEM/Application&nbsp;ID&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;OID&nbsp;=&nbsp;0x5048<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;Product&nbsp;name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;PNM&nbsp;=&nbsp;SD512<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;Product&nbsp;revision&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;PRV&nbsp;=&nbsp;hwrev(0x01)&nbsp;&nbsp;fwrev(0x01)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;Product&nbsp;serial&nbsp;number&nbsp;:&nbsp;PSN&nbsp;=&nbsp;0x21f05601<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;Manufacturing&nbsp;date&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;MDT&nbsp;=&nbsp;2006-08<br /><br /><br />Request&nbsp;49&nbsp;00&nbsp;00&nbsp;00&nbsp;00&nbsp;ff&nbsp;ff<br />Sent&nbsp;command&nbsp;cmd&nbsp;=&nbsp;09&nbsp;arg&nbsp;=&nbsp;0:&nbsp;reply&nbsp;bytes&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff<br />&nbsp;&nbsp;loop&nbsp;0,&nbsp;additional&nbsp;reply&nbsp;00<br />mmc_spi_read_data():&nbsp;got&nbsp;data&nbsp;and&nbsp;CRC&nbsp;53&nbsp;78<br /><br /><br />CSD&nbsp;data:&nbsp;00&nbsp;4f&nbsp;00&nbsp;32&nbsp;5f&nbsp;59&nbsp;83&nbsp;ca&nbsp;f6&nbsp;db&nbsp;7f&nbsp;87&nbsp;8a&nbsp;40&nbsp;00&nbsp;2d<br />CID&nbsp;data:&nbsp;register<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;Data&nbsp;read&nbsp;time&nbsp;parameter1&nbsp;:&nbsp;TAAC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;40000000ns<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;Data&nbsp;read&nbsp;time&nbsp;parameter2&nbsp;:&nbsp;NSAC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;Max&nbsp;data&nbsp;transfer&nbsp;rate&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;TRAN_SPEED&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;25000000Hz<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;Card&nbsp;command&nbsp;class&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;CCC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;5f5<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;Card&nbsp;capacity&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;C_SIZE、C_SIZE_MULT&nbsp;&nbsp;=&nbsp;994304&nbsp;Blocks&nbsp;(485MB)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;Max&nbsp;read&nbsp;data&nbsp;length&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;READ_BL_LEN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;9<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;Read&nbsp;block&nbsp;partial&nbsp;enable&nbsp;:&nbsp;READ_BL_PARTIAL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;Write&nbsp;block&nbsp;misalign&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;WRITE_BLK_MISALIGN&nbsp;&nbsp;&nbsp;=&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;Read&nbsp;block&nbsp;misalign&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;READ_BLK_MISALIGN&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;Write&nbsp;speed&nbsp;factor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;R2W_FACTOR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;Max&nbsp;write&nbsp;data&nbsp;length&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;WRITE_BL_LEN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;9<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;Write&nbsp;block&nbsp;partial&nbsp;enable:&nbsp;WRITE_BL_PARTIAL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;0<br /><br /><br />mmc_spi_read_disk_block(0):&nbsp;sending&nbsp;command<br />Request&nbsp;51&nbsp;00&nbsp;00&nbsp;00&nbsp;00&nbsp;ff&nbsp;ff<br />Sent&nbsp;command&nbsp;cmd&nbsp;=&nbsp;11&nbsp;arg&nbsp;=&nbsp;0:&nbsp;reply&nbsp;bytes&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff<br />&nbsp;&nbsp;loop&nbsp;0,&nbsp;additional&nbsp;reply&nbsp;00<br />mmc_spi_read_disk_block(0):&nbsp;reading&nbsp;data&nbsp;token/data/crc<br />mmc_spi_read_data():&nbsp;got&nbsp;data&nbsp;and&nbsp;CRC&nbsp;96&nbsp;bc<br /><br /><br />MBR&nbsp;dump<br />&nbsp;0000:&nbsp;eb&nbsp;58&nbsp;90&nbsp;4d&nbsp;&nbsp;53&nbsp;44&nbsp;4f&nbsp;53&nbsp;&nbsp;35&nbsp;2e&nbsp;30&nbsp;00&nbsp;&nbsp;02&nbsp;08&nbsp;20&nbsp;00<br />&nbsp;0010:&nbsp;02&nbsp;00&nbsp;00&nbsp;00&nbsp;&nbsp;00&nbsp;f8&nbsp;00&nbsp;00&nbsp;&nbsp;3f&nbsp;00&nbsp;ff&nbsp;00&nbsp;&nbsp;00&nbsp;00&nbsp;00&nbsp;00<br />&nbsp;0020:&nbsp;00&nbsp;2c&nbsp;0f&nbsp;00&nbsp;&nbsp;ca&nbsp;03&nbsp;00&nbsp;00&nbsp;&nbsp;00&nbsp;00&nbsp;00&nbsp;00&nbsp;&nbsp;02&nbsp;00&nbsp;00&nbsp;00<br />&nbsp;0030:&nbsp;01&nbsp;00&nbsp;06&nbsp;00&nbsp;&nbsp;00&nbsp;00&nbsp;00&nbsp;00&nbsp;&nbsp;00&nbsp;00&nbsp;00&nbsp;00&nbsp;&nbsp;00&nbsp;00&nbsp;00&nbsp;00<br />&nbsp;0040:&nbsp;00&nbsp;00&nbsp;29&nbsp;cb&nbsp;&nbsp;90&nbsp;87&nbsp;a8&nbsp;4e&nbsp;&nbsp;4f&nbsp;20&nbsp;4e&nbsp;41&nbsp;&nbsp;4d&nbsp;45&nbsp;20&nbsp;20<br />&nbsp;0050:&nbsp;20&nbsp;20&nbsp;46&nbsp;41&nbsp;&nbsp;54&nbsp;33&nbsp;32&nbsp;20&nbsp;&nbsp;20&nbsp;20&nbsp;33&nbsp;c9&nbsp;&nbsp;8e&nbsp;d1&nbsp;bc&nbsp;f4<br />&nbsp;0060:&nbsp;7b&nbsp;8e&nbsp;c1&nbsp;8e&nbsp;&nbsp;d9&nbsp;bd&nbsp;00&nbsp;7c&nbsp;&nbsp;88&nbsp;4e&nbsp;02&nbsp;8a&nbsp;&nbsp;56&nbsp;40&nbsp;b4&nbsp;08<br />&nbsp;0070:&nbsp;cd&nbsp;13&nbsp;73&nbsp;05&nbsp;&nbsp;b9&nbsp;ff&nbsp;ff&nbsp;8a&nbsp;&nbsp;f1&nbsp;66&nbsp;0f&nbsp;b6&nbsp;&nbsp;c6&nbsp;40&nbsp;66&nbsp;0f<br />&nbsp;0080:&nbsp;b6&nbsp;d1&nbsp;80&nbsp;e2&nbsp;&nbsp;3f&nbsp;f7&nbsp;e2&nbsp;86&nbsp;&nbsp;cd&nbsp;c0&nbsp;ed&nbsp;06&nbsp;&nbsp;41&nbsp;66&nbsp;0f&nbsp;b7<br />&nbsp;0090:&nbsp;c9&nbsp;66&nbsp;f7&nbsp;e1&nbsp;&nbsp;66&nbsp;89&nbsp;46&nbsp;f8&nbsp;&nbsp;83&nbsp;7e&nbsp;16&nbsp;00&nbsp;&nbsp;75&nbsp;38&nbsp;83&nbsp;7e<br />&nbsp;00a0:&nbsp;2a&nbsp;00&nbsp;77&nbsp;32&nbsp;&nbsp;66&nbsp;8b&nbsp;46&nbsp;1c&nbsp;&nbsp;66&nbsp;83&nbsp;c0&nbsp;0c&nbsp;&nbsp;bb&nbsp;00&nbsp;80&nbsp;b9<br />&nbsp;00b0:&nbsp;01&nbsp;00&nbsp;e8&nbsp;2b&nbsp;&nbsp;00&nbsp;e9&nbsp;48&nbsp;03&nbsp;&nbsp;a0&nbsp;fa&nbsp;7d&nbsp;b4&nbsp;&nbsp;7d&nbsp;8b&nbsp;f0&nbsp;ac<br />&nbsp;00c0:&nbsp;84&nbsp;c0&nbsp;74&nbsp;17&nbsp;&nbsp;3c&nbsp;ff&nbsp;74&nbsp;09&nbsp;&nbsp;b4&nbsp;0e&nbsp;bb&nbsp;07&nbsp;&nbsp;00&nbsp;cd&nbsp;10&nbsp;eb<br />&nbsp;00d0:&nbsp;ee&nbsp;a0&nbsp;fb&nbsp;7d&nbsp;&nbsp;eb&nbsp;e5&nbsp;a0&nbsp;f9&nbsp;&nbsp;7d&nbsp;eb&nbsp;e0&nbsp;98&nbsp;&nbsp;cd&nbsp;16&nbsp;cd&nbsp;19<br />&nbsp;00e0:&nbsp;66&nbsp;60&nbsp;66&nbsp;3b&nbsp;&nbsp;46&nbsp;f8&nbsp;0f&nbsp;82&nbsp;&nbsp;4a&nbsp;00&nbsp;66&nbsp;6a&nbsp;&nbsp;00&nbsp;66&nbsp;50&nbsp;06<br />&nbsp;00f0:&nbsp;53&nbsp;66&nbsp;68&nbsp;10&nbsp;&nbsp;00&nbsp;01&nbsp;00&nbsp;80&nbsp;&nbsp;7e&nbsp;02&nbsp;00&nbsp;0f&nbsp;&nbsp;85&nbsp;20&nbsp;00&nbsp;b4<br />&nbsp;0100:&nbsp;41&nbsp;bb&nbsp;aa&nbsp;55&nbsp;&nbsp;8a&nbsp;56&nbsp;40&nbsp;cd&nbsp;&nbsp;13&nbsp;0f&nbsp;82&nbsp;1c&nbsp;&nbsp;00&nbsp;81&nbsp;fb&nbsp;55<br />&nbsp;0110:&nbsp;aa&nbsp;0f&nbsp;85&nbsp;14&nbsp;&nbsp;00&nbsp;f6&nbsp;c1&nbsp;01&nbsp;&nbsp;0f&nbsp;84&nbsp;0d&nbsp;00&nbsp;&nbsp;fe&nbsp;46&nbsp;02&nbsp;b4<br />&nbsp;0120:&nbsp;42&nbsp;8a&nbsp;56&nbsp;40&nbsp;&nbsp;8b&nbsp;f4&nbsp;cd&nbsp;13&nbsp;&nbsp;b0&nbsp;f9&nbsp;66&nbsp;58&nbsp;&nbsp;66&nbsp;58&nbsp;66&nbsp;58<br />&nbsp;0130:&nbsp;66&nbsp;58&nbsp;eb&nbsp;2a&nbsp;&nbsp;66&nbsp;33&nbsp;d2&nbsp;66&nbsp;&nbsp;0f&nbsp;b7&nbsp;4e&nbsp;18&nbsp;&nbsp;66&nbsp;f7&nbsp;f1&nbsp;fe<br />&nbsp;0140:&nbsp;c2&nbsp;8a&nbsp;ca&nbsp;66&nbsp;&nbsp;8b&nbsp;d0&nbsp;66&nbsp;c1&nbsp;&nbsp;ea&nbsp;10&nbsp;f7&nbsp;76&nbsp;&nbsp;1a&nbsp;86&nbsp;d6&nbsp;8a<br />&nbsp;0150:&nbsp;56&nbsp;40&nbsp;8a&nbsp;e8&nbsp;&nbsp;c0&nbsp;e4&nbsp;06&nbsp;0a&nbsp;&nbsp;cc&nbsp;b8&nbsp;01&nbsp;02&nbsp;&nbsp;cd&nbsp;13&nbsp;66&nbsp;61<br />&nbsp;0160:&nbsp;0f&nbsp;82&nbsp;54&nbsp;ff&nbsp;&nbsp;81&nbsp;c3&nbsp;00&nbsp;02&nbsp;&nbsp;66&nbsp;40&nbsp;49&nbsp;0f&nbsp;&nbsp;85&nbsp;71&nbsp;ff&nbsp;c3<br />&nbsp;0170:&nbsp;4e&nbsp;54&nbsp;4c&nbsp;44&nbsp;&nbsp;52&nbsp;20&nbsp;20&nbsp;20&nbsp;&nbsp;20&nbsp;20&nbsp;20&nbsp;00&nbsp;&nbsp;00&nbsp;00&nbsp;00&nbsp;00<br />&nbsp;0180:&nbsp;00&nbsp;00&nbsp;00&nbsp;00&nbsp;&nbsp;00&nbsp;00&nbsp;00&nbsp;00&nbsp;&nbsp;00&nbsp;00&nbsp;00&nbsp;00&nbsp;&nbsp;00&nbsp;00&nbsp;00&nbsp;00<br />&nbsp;0190:&nbsp;00&nbsp;00&nbsp;00&nbsp;00&nbsp;&nbsp;00&nbsp;00&nbsp;00&nbsp;00&nbsp;&nbsp;00&nbsp;00&nbsp;00&nbsp;00&nbsp;&nbsp;00&nbsp;00&nbsp;00&nbsp;00<br />&nbsp;01a0:&nbsp;00&nbsp;00&nbsp;00&nbsp;00&nbsp;&nbsp;00&nbsp;00&nbsp;00&nbsp;00&nbsp;&nbsp;00&nbsp;00&nbsp;00&nbsp;00&nbsp;&nbsp;0d&nbsp;0a&nbsp;4e&nbsp;54<br />&nbsp;01b0:&nbsp;4c&nbsp;44&nbsp;52&nbsp;20&nbsp;&nbsp;69&nbsp;73&nbsp;20&nbsp;6d&nbsp;&nbsp;69&nbsp;73&nbsp;73&nbsp;69&nbsp;&nbsp;6e&nbsp;67&nbsp;ff&nbsp;0d<br />&nbsp;01c0:&nbsp;0a&nbsp;44&nbsp;69&nbsp;73&nbsp;&nbsp;6b&nbsp;20&nbsp;65&nbsp;72&nbsp;&nbsp;72&nbsp;6f&nbsp;72&nbsp;ff&nbsp;&nbsp;0d&nbsp;0a&nbsp;50&nbsp;72<br />&nbsp;01d0:&nbsp;65&nbsp;73&nbsp;73&nbsp;20&nbsp;&nbsp;61&nbsp;6e&nbsp;79&nbsp;20&nbsp;&nbsp;6b&nbsp;65&nbsp;79&nbsp;20&nbsp;&nbsp;74&nbsp;6f&nbsp;20&nbsp;72<br />&nbsp;01e0:&nbsp;65&nbsp;73&nbsp;74&nbsp;61&nbsp;&nbsp;72&nbsp;74&nbsp;0d&nbsp;0a&nbsp;&nbsp;00&nbsp;00&nbsp;00&nbsp;00&nbsp;&nbsp;00&nbsp;00&nbsp;00&nbsp;00<br />&nbsp;01f0:&nbsp;00&nbsp;00&nbsp;00&nbsp;00&nbsp;&nbsp;00&nbsp;00&nbsp;00&nbsp;00&nbsp;&nbsp;00&nbsp;ac&nbsp;bf&nbsp;cc&nbsp;&nbsp;00&nbsp;00&nbsp;55&nbsp;aa<br />Read&nbsp;block&nbsp;0&nbsp;(partition&nbsp;table)<br />Signature&nbsp;0x55&nbsp;0xaa,&nbsp;should&nbsp;be&nbsp;0x55&nbsp;0xaa<br />Partition&nbsp;0:&nbsp;boot&nbsp;ff,&nbsp;first&nbsp;sector&nbsp;0d&nbsp;0a&nbsp;44,&nbsp;file&nbsp;system&nbsp;69,&nbsp;last&nbsp;sector&nbsp;73&nbsp;6b&nbsp;20<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;first&nbsp;sector&nbsp;(linear)&nbsp;6f&nbsp;72&nbsp;72&nbsp;65,&nbsp;sector&nbsp;count&nbsp;0a&nbsp;0d&nbsp;ff&nbsp;72<br />Partition&nbsp;1:&nbsp;boot&nbsp;50,&nbsp;first&nbsp;sector&nbsp;72&nbsp;65&nbsp;73,&nbsp;file&nbsp;system&nbsp;73,&nbsp;last&nbsp;sector&nbsp;20&nbsp;61&nbsp;6e<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;first&nbsp;sector&nbsp;(linear)&nbsp;65&nbsp;6b&nbsp;20&nbsp;79,&nbsp;sector&nbsp;count&nbsp;6f&nbsp;74&nbsp;20&nbsp;79<br />Partition&nbsp;2:&nbsp;boot&nbsp;20,&nbsp;first&nbsp;sector&nbsp;72&nbsp;65&nbsp;73,&nbsp;file&nbsp;system&nbsp;74,&nbsp;last&nbsp;sector&nbsp;61&nbsp;72&nbsp;74<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;first&nbsp;sector&nbsp;(linear)&nbsp;00&nbsp;00&nbsp;0a&nbsp;0d,&nbsp;sector&nbsp;count&nbsp;00&nbsp;00&nbsp;00&nbsp;00<br />Partition&nbsp;3:&nbsp;boot&nbsp;00,&nbsp;first&nbsp;sector&nbsp;00&nbsp;00&nbsp;00,&nbsp;file&nbsp;system&nbsp;00,&nbsp;last&nbsp;sector&nbsp;00&nbsp;00&nbsp;00<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;first&nbsp;sector&nbsp;(linear)&nbsp;ac&nbsp;00&nbsp;00&nbsp;00,&nbsp;sector&nbsp;count&nbsp;00&nbsp;00&nbsp;cc&nbsp;bf<br /><br /><br />mmc_spi_read_disk_block(0):&nbsp;sending&nbsp;command<br />Request&nbsp;51&nbsp;00&nbsp;00&nbsp;00&nbsp;00&nbsp;ff&nbsp;ff<br />Sent&nbsp;command&nbsp;cmd&nbsp;=&nbsp;11&nbsp;arg&nbsp;=&nbsp;0:&nbsp;reply&nbsp;bytes&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff<br />&nbsp;&nbsp;loop&nbsp;0,&nbsp;additional&nbsp;reply&nbsp;00<br />mmc_spi_read_disk_block(0):&nbsp;reading&nbsp;data&nbsp;token/data/crc<br />mmc_spi_read_data():&nbsp;got&nbsp;data&nbsp;and&nbsp;CRC&nbsp;96&nbsp;bc<br /><br /><br />Sector&nbsp;info(0&nbsp;sec&nbsp;:&nbsp;boot):<br />----------------------------------------------------------------<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;eb&nbsp;58&nbsp;90&nbsp;4d&nbsp;53&nbsp;44&nbsp;4f&nbsp;53&nbsp;35&nbsp;2e&nbsp;30&nbsp;&nbsp;0&nbsp;&nbsp;2&nbsp;&nbsp;8&nbsp;20&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;f8&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;3f&nbsp;&nbsp;0&nbsp;ff&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;20&nbsp;&nbsp;&nbsp;0&nbsp;2c&nbsp;&nbsp;f&nbsp;&nbsp;0&nbsp;ca&nbsp;&nbsp;3&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;2&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;30&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;0&nbsp;&nbsp;6&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;40&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;29&nbsp;cb&nbsp;90&nbsp;87&nbsp;a8&nbsp;4e&nbsp;4f&nbsp;20&nbsp;4e&nbsp;41&nbsp;4d&nbsp;45&nbsp;20&nbsp;20&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;50&nbsp;&nbsp;20&nbsp;20&nbsp;46&nbsp;41&nbsp;54&nbsp;33&nbsp;32&nbsp;20&nbsp;20&nbsp;20&nbsp;33&nbsp;c9&nbsp;8e&nbsp;d1&nbsp;bc&nbsp;f4&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;60&nbsp;&nbsp;7b&nbsp;8e&nbsp;c1&nbsp;8e&nbsp;d9&nbsp;bd&nbsp;&nbsp;0&nbsp;7c&nbsp;88&nbsp;4e&nbsp;&nbsp;2&nbsp;8a&nbsp;56&nbsp;40&nbsp;b4&nbsp;&nbsp;8&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;70&nbsp;&nbsp;cd&nbsp;13&nbsp;73&nbsp;&nbsp;5&nbsp;b9&nbsp;ff&nbsp;ff&nbsp;8a&nbsp;f1&nbsp;66&nbsp;&nbsp;f&nbsp;b6&nbsp;c6&nbsp;40&nbsp;66&nbsp;&nbsp;f&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;80&nbsp;&nbsp;b6&nbsp;d1&nbsp;80&nbsp;e2&nbsp;3f&nbsp;f7&nbsp;e2&nbsp;86&nbsp;cd&nbsp;c0&nbsp;ed&nbsp;&nbsp;6&nbsp;41&nbsp;66&nbsp;&nbsp;f&nbsp;b7&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;90&nbsp;&nbsp;c9&nbsp;66&nbsp;f7&nbsp;e1&nbsp;66&nbsp;89&nbsp;46&nbsp;f8&nbsp;83&nbsp;7e&nbsp;16&nbsp;&nbsp;0&nbsp;75&nbsp;38&nbsp;83&nbsp;7e&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a0&nbsp;&nbsp;2a&nbsp;&nbsp;0&nbsp;77&nbsp;32&nbsp;66&nbsp;8b&nbsp;46&nbsp;1c&nbsp;66&nbsp;83&nbsp;c0&nbsp;&nbsp;c&nbsp;bb&nbsp;&nbsp;0&nbsp;80&nbsp;b9&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b0&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;0&nbsp;e8&nbsp;2b&nbsp;&nbsp;0&nbsp;e9&nbsp;48&nbsp;&nbsp;3&nbsp;a0&nbsp;fa&nbsp;7d&nbsp;b4&nbsp;7d&nbsp;8b&nbsp;f0&nbsp;ac&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c0&nbsp;&nbsp;84&nbsp;c0&nbsp;74&nbsp;17&nbsp;3c&nbsp;ff&nbsp;74&nbsp;&nbsp;9&nbsp;b4&nbsp;&nbsp;e&nbsp;bb&nbsp;&nbsp;7&nbsp;&nbsp;0&nbsp;cd&nbsp;10&nbsp;eb&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d0&nbsp;&nbsp;ee&nbsp;a0&nbsp;fb&nbsp;7d&nbsp;eb&nbsp;e5&nbsp;a0&nbsp;f9&nbsp;7d&nbsp;eb&nbsp;e0&nbsp;98&nbsp;cd&nbsp;16&nbsp;cd&nbsp;19&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e0&nbsp;&nbsp;66&nbsp;60&nbsp;66&nbsp;3b&nbsp;46&nbsp;f8&nbsp;&nbsp;f&nbsp;82&nbsp;4a&nbsp;&nbsp;0&nbsp;66&nbsp;6a&nbsp;&nbsp;0&nbsp;66&nbsp;50&nbsp;&nbsp;6&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f0&nbsp;&nbsp;53&nbsp;66&nbsp;68&nbsp;10&nbsp;&nbsp;0&nbsp;&nbsp;1&nbsp;&nbsp;0&nbsp;80&nbsp;7e&nbsp;&nbsp;2&nbsp;&nbsp;0&nbsp;&nbsp;f&nbsp;85&nbsp;20&nbsp;&nbsp;0&nbsp;b4&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;100&nbsp;&nbsp;41&nbsp;bb&nbsp;aa&nbsp;55&nbsp;8a&nbsp;56&nbsp;40&nbsp;cd&nbsp;13&nbsp;&nbsp;f&nbsp;82&nbsp;1c&nbsp;&nbsp;0&nbsp;81&nbsp;fb&nbsp;55&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;110&nbsp;&nbsp;aa&nbsp;&nbsp;f&nbsp;85&nbsp;14&nbsp;&nbsp;0&nbsp;f6&nbsp;c1&nbsp;&nbsp;1&nbsp;&nbsp;f&nbsp;84&nbsp;&nbsp;d&nbsp;&nbsp;0&nbsp;fe&nbsp;46&nbsp;&nbsp;2&nbsp;b4&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;120&nbsp;&nbsp;42&nbsp;8a&nbsp;56&nbsp;40&nbsp;8b&nbsp;f4&nbsp;cd&nbsp;13&nbsp;b0&nbsp;f9&nbsp;66&nbsp;58&nbsp;66&nbsp;58&nbsp;66&nbsp;58&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;130&nbsp;&nbsp;66&nbsp;58&nbsp;eb&nbsp;2a&nbsp;66&nbsp;33&nbsp;d2&nbsp;66&nbsp;&nbsp;f&nbsp;b7&nbsp;4e&nbsp;18&nbsp;66&nbsp;f7&nbsp;f1&nbsp;fe&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;140&nbsp;&nbsp;c2&nbsp;8a&nbsp;ca&nbsp;66&nbsp;8b&nbsp;d0&nbsp;66&nbsp;c1&nbsp;ea&nbsp;10&nbsp;f7&nbsp;76&nbsp;1a&nbsp;86&nbsp;d6&nbsp;8a&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;150&nbsp;&nbsp;56&nbsp;40&nbsp;8a&nbsp;e8&nbsp;c0&nbsp;e4&nbsp;&nbsp;6&nbsp;&nbsp;a&nbsp;cc&nbsp;b8&nbsp;&nbsp;1&nbsp;&nbsp;2&nbsp;cd&nbsp;13&nbsp;66&nbsp;61&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;160&nbsp;&nbsp;&nbsp;f&nbsp;82&nbsp;54&nbsp;ff&nbsp;81&nbsp;c3&nbsp;&nbsp;0&nbsp;&nbsp;2&nbsp;66&nbsp;40&nbsp;49&nbsp;&nbsp;f&nbsp;85&nbsp;71&nbsp;ff&nbsp;c3&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;170&nbsp;&nbsp;4e&nbsp;54&nbsp;4c&nbsp;44&nbsp;52&nbsp;20&nbsp;20&nbsp;20&nbsp;20&nbsp;20&nbsp;20&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;180&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;190&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1a0&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;d&nbsp;&nbsp;a&nbsp;4e&nbsp;54&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1b0&nbsp;&nbsp;4c&nbsp;44&nbsp;52&nbsp;20&nbsp;69&nbsp;73&nbsp;20&nbsp;6d&nbsp;69&nbsp;73&nbsp;73&nbsp;69&nbsp;6e&nbsp;67&nbsp;ff&nbsp;&nbsp;d&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1c0&nbsp;&nbsp;&nbsp;a&nbsp;44&nbsp;69&nbsp;73&nbsp;6b&nbsp;20&nbsp;65&nbsp;72&nbsp;72&nbsp;6f&nbsp;72&nbsp;ff&nbsp;&nbsp;d&nbsp;&nbsp;a&nbsp;50&nbsp;72&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1d0&nbsp;&nbsp;65&nbsp;73&nbsp;73&nbsp;20&nbsp;61&nbsp;6e&nbsp;79&nbsp;20&nbsp;6b&nbsp;65&nbsp;79&nbsp;20&nbsp;74&nbsp;6f&nbsp;20&nbsp;72&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1e0&nbsp;&nbsp;65&nbsp;73&nbsp;74&nbsp;61&nbsp;72&nbsp;74&nbsp;&nbsp;d&nbsp;&nbsp;a&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1f0&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;ac&nbsp;bf&nbsp;cc&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;55&nbsp;aa&nbsp;<br /><br />----------------------------------------------------------------<br /><br />mmc_spi_read_disk_block(32):&nbsp;sending&nbsp;command<br />Request&nbsp;51&nbsp;00&nbsp;00&nbsp;40&nbsp;00&nbsp;ff&nbsp;ff<br />Sent&nbsp;command&nbsp;cmd&nbsp;=&nbsp;11&nbsp;arg&nbsp;=&nbsp;16384:&nbsp;reply&nbsp;bytes&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff<br />&nbsp;&nbsp;loop&nbsp;0,&nbsp;additional&nbsp;reply&nbsp;00<br />mmc_spi_read_disk_block(32):&nbsp;reading&nbsp;data&nbsp;token/data/crc<br />mmc_spi_read_data():&nbsp;got&nbsp;data&nbsp;and&nbsp;CRC&nbsp;76&nbsp;3a<br /><br /><br />Sector&nbsp;info(32&nbsp;sec&nbsp;:&nbsp;root&nbsp;dir):<br />----------------------------------------------------------------<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;f8&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;&nbsp;f&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;&nbsp;f&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10&nbsp;&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;&nbsp;f&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;20&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;30&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;40&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;50&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;60&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;70&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;80&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;90&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a0&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b0&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c0&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d0&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e0&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f0&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;100&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;110&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;120&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;130&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;140&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;150&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;160&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;170&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;180&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;190&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1a0&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1b0&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1c0&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1d0&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1e0&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1f0&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br /><br />----------------------------------------------------------------<br /><br />mmc_spi_read_disk_block(1980):&nbsp;sending&nbsp;command<br />Request&nbsp;51&nbsp;00&nbsp;0f&nbsp;78&nbsp;00&nbsp;ff&nbsp;ff<br />Sent&nbsp;command&nbsp;cmd&nbsp;=&nbsp;11&nbsp;arg&nbsp;=&nbsp;1013760:&nbsp;reply&nbsp;bytes&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff<br />&nbsp;&nbsp;loop&nbsp;0,&nbsp;additional&nbsp;reply&nbsp;00<br />mmc_spi_read_disk_block(1980):&nbsp;reading&nbsp;data&nbsp;token/data/crc<br />mmc_spi_read_data():&nbsp;got&nbsp;data&nbsp;and&nbsp;CRC&nbsp;9a&nbsp;31<br /><br /><br />Sector&nbsp;info(1980&nbsp;sec&nbsp;:&nbsp;a.txt):<br />----------------------------------------------------------------<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;31&nbsp;32&nbsp;33&nbsp;34&nbsp;35&nbsp;36&nbsp;37&nbsp;38&nbsp;39&nbsp;30&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;20&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;30&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;40&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;50&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;60&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;70&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;80&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;90&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a0&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b0&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c0&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d0&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e0&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f0&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;100&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;110&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;120&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;130&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;140&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;150&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;160&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;170&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;180&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;190&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1a0&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1b0&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1c0&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1d0&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1e0&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1f0&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br /><br />----------------------------------------------------------------<br /><br />mmc_spi_read_disk_block(1988):&nbsp;sending&nbsp;command<br />Request&nbsp;51&nbsp;00&nbsp;0f&nbsp;88&nbsp;00&nbsp;ff&nbsp;ff<br />Sent&nbsp;command&nbsp;cmd&nbsp;=&nbsp;11&nbsp;arg&nbsp;=&nbsp;1017856:&nbsp;reply&nbsp;bytes&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff<br />&nbsp;&nbsp;loop&nbsp;0,&nbsp;additional&nbsp;reply&nbsp;00<br />mmc_spi_read_disk_block(1988):&nbsp;reading&nbsp;data&nbsp;token/data/crc<br />mmc_spi_read_data():&nbsp;got&nbsp;data&nbsp;and&nbsp;CRC&nbsp;67&nbsp;a2<br /><br /><br />Sector&nbsp;info(1988&nbsp;sec&nbsp;:&nbsp;b.txt):<br />----------------------------------------------------------------<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;61&nbsp;62&nbsp;63&nbsp;64&nbsp;65&nbsp;66&nbsp;67&nbsp;68&nbsp;69&nbsp;6a&nbsp;6b&nbsp;6c&nbsp;6d&nbsp;6e&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;20&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;30&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;40&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;50&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;60&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;70&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;80&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;90&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a0&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b0&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c0&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d0&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e0&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f0&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;100&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;110&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;120&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;130&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;140&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;150&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;160&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;170&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;180&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;190&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1a0&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1b0&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1c0&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1d0&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1e0&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1f0&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;<br /><br />----------------------------------------------------------------<br /><br /><br /><br />Write&nbsp;test<br />mmc_spi_write_disk_block(),&nbsp;sending&nbsp;command<br />Request&nbsp;58&nbsp;00&nbsp;00&nbsp;c8&nbsp;00&nbsp;ff&nbsp;ff<br />Sent&nbsp;command&nbsp;cmd&nbsp;=&nbsp;18&nbsp;arg&nbsp;=&nbsp;51200:&nbsp;reply&nbsp;bytes&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff<br />&nbsp;&nbsp;loop&nbsp;0,&nbsp;additional&nbsp;reply&nbsp;00<br />mmc_spi_write_disk_block():&nbsp;sending&nbsp;data&nbsp;token/data/crc<br />mmc_spi_write_disk_block():&nbsp;got&nbsp;data&nbsp;response&nbsp;token&nbsp;e5<br />mmc_spi_write_disk_block(),&nbsp;polling&nbsp;for&nbsp;!&nbsp;busy,&nbsp;got&nbsp;response&nbsp;00<br />mmc_spi_write_disk_block(),&nbsp;polling&nbsp;for&nbsp;!&nbsp;busy,&nbsp;got&nbsp;response&nbsp;00<br />mmc_spi_write_disk_block(),&nbsp;polling&nbsp;for&nbsp;!&nbsp;busy,&nbsp;got&nbsp;response&nbsp;00<br />mmc_spi_write_disk_block(),&nbsp;polling&nbsp;for&nbsp;!&nbsp;busy,&nbsp;got&nbsp;response&nbsp;00<br />mmc_spi_write_disk_block(),&nbsp;polling&nbsp;for&nbsp;!&nbsp;busy,&nbsp;got&nbsp;response&nbsp;00<br />mmc_spi_write_disk_block(),&nbsp;polling&nbsp;for&nbsp;!&nbsp;busy,&nbsp;got&nbsp;response&nbsp;00<br />mmc_spi_write_disk_block(),&nbsp;polling&nbsp;for&nbsp;!&nbsp;busy,&nbsp;got&nbsp;response&nbsp;00<br />mmc_spi_write_disk_block(),&nbsp;polling&nbsp;for&nbsp;!&nbsp;busy,&nbsp;got&nbsp;response&nbsp;00<br />mmc_spi_write_disk_block(),&nbsp;polling&nbsp;for&nbsp;!&nbsp;busy,&nbsp;got&nbsp;response&nbsp;01<br />mmc_spi_read_disk_block(100):&nbsp;sending&nbsp;command<br />Request&nbsp;51&nbsp;00&nbsp;00&nbsp;c8&nbsp;00&nbsp;ff&nbsp;ff<br />Sent&nbsp;command&nbsp;cmd&nbsp;=&nbsp;11&nbsp;arg&nbsp;=&nbsp;51200:&nbsp;reply&nbsp;bytes&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff&nbsp;ff<br />&nbsp;&nbsp;loop&nbsp;0,&nbsp;additional&nbsp;reply&nbsp;00<br />mmc_spi_read_disk_block(100):&nbsp;reading&nbsp;data&nbsp;token/data/crc<br />mmc_spi_read_data():&nbsp;got&nbsp;data&nbsp;and&nbsp;CRC&nbsp;40&nbsp;da<br /><br /><br />Sector&nbsp;info(100&nbsp;sec&nbsp;:&nbsp;test):<br />----------------------------------------------------------------<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;1&nbsp;&nbsp;2&nbsp;&nbsp;3&nbsp;&nbsp;4&nbsp;&nbsp;5&nbsp;&nbsp;6&nbsp;&nbsp;7&nbsp;&nbsp;8&nbsp;&nbsp;9&nbsp;&nbsp;a&nbsp;&nbsp;b&nbsp;&nbsp;c&nbsp;&nbsp;d&nbsp;&nbsp;e&nbsp;&nbsp;f&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10&nbsp;&nbsp;10&nbsp;11&nbsp;12&nbsp;13&nbsp;14&nbsp;15&nbsp;16&nbsp;17&nbsp;18&nbsp;19&nbsp;1a&nbsp;1b&nbsp;1c&nbsp;1d&nbsp;1e&nbsp;1f&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;20&nbsp;&nbsp;20&nbsp;21&nbsp;22&nbsp;23&nbsp;24&nbsp;25&nbsp;26&nbsp;27&nbsp;28&nbsp;29&nbsp;2a&nbsp;2b&nbsp;2c&nbsp;2d&nbsp;2e&nbsp;2f&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;30&nbsp;&nbsp;30&nbsp;31&nbsp;32&nbsp;33&nbsp;34&nbsp;35&nbsp;36&nbsp;37&nbsp;38&nbsp;39&nbsp;3a&nbsp;3b&nbsp;3c&nbsp;3d&nbsp;3e&nbsp;3f&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;40&nbsp;&nbsp;40&nbsp;41&nbsp;42&nbsp;43&nbsp;44&nbsp;45&nbsp;46&nbsp;47&nbsp;48&nbsp;49&nbsp;4a&nbsp;4b&nbsp;4c&nbsp;4d&nbsp;4e&nbsp;4f&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;50&nbsp;&nbsp;50&nbsp;51&nbsp;52&nbsp;53&nbsp;54&nbsp;55&nbsp;56&nbsp;57&nbsp;58&nbsp;59&nbsp;5a&nbsp;5b&nbsp;5c&nbsp;5d&nbsp;5e&nbsp;5f&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;60&nbsp;&nbsp;60&nbsp;61&nbsp;62&nbsp;63&nbsp;64&nbsp;65&nbsp;66&nbsp;67&nbsp;68&nbsp;69&nbsp;6a&nbsp;6b&nbsp;6c&nbsp;6d&nbsp;6e&nbsp;6f&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;70&nbsp;&nbsp;70&nbsp;71&nbsp;72&nbsp;73&nbsp;74&nbsp;75&nbsp;76&nbsp;77&nbsp;78&nbsp;79&nbsp;7a&nbsp;7b&nbsp;7c&nbsp;7d&nbsp;7e&nbsp;7f&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;80&nbsp;&nbsp;80&nbsp;81&nbsp;82&nbsp;83&nbsp;84&nbsp;85&nbsp;86&nbsp;87&nbsp;88&nbsp;89&nbsp;8a&nbsp;8b&nbsp;8c&nbsp;8d&nbsp;8e&nbsp;8f&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;90&nbsp;&nbsp;90&nbsp;91&nbsp;92&nbsp;93&nbsp;94&nbsp;95&nbsp;96&nbsp;97&nbsp;98&nbsp;99&nbsp;9a&nbsp;9b&nbsp;9c&nbsp;9d&nbsp;9e&nbsp;9f&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a0&nbsp;&nbsp;a0&nbsp;a1&nbsp;a2&nbsp;a3&nbsp;a4&nbsp;a5&nbsp;a6&nbsp;a7&nbsp;a8&nbsp;a9&nbsp;aa&nbsp;ab&nbsp;ac&nbsp;ad&nbsp;ae&nbsp;af&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b0&nbsp;&nbsp;b0&nbsp;b1&nbsp;b2&nbsp;b3&nbsp;b4&nbsp;b5&nbsp;b6&nbsp;b7&nbsp;b8&nbsp;b9&nbsp;ba&nbsp;bb&nbsp;bc&nbsp;bd&nbsp;be&nbsp;bf&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c0&nbsp;&nbsp;c0&nbsp;c1&nbsp;c2&nbsp;c3&nbsp;c4&nbsp;c5&nbsp;c6&nbsp;c7&nbsp;c8&nbsp;c9&nbsp;ca&nbsp;cb&nbsp;cc&nbsp;cd&nbsp;ce&nbsp;cf&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d0&nbsp;&nbsp;d0&nbsp;d1&nbsp;d2&nbsp;d3&nbsp;d4&nbsp;d5&nbsp;d6&nbsp;d7&nbsp;d8&nbsp;d9&nbsp;da&nbsp;db&nbsp;dc&nbsp;dd&nbsp;de&nbsp;df&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e0&nbsp;&nbsp;e0&nbsp;e1&nbsp;e2&nbsp;e3&nbsp;e4&nbsp;e5&nbsp;e6&nbsp;e7&nbsp;e8&nbsp;e9&nbsp;ea&nbsp;eb&nbsp;ec&nbsp;ed&nbsp;ee&nbsp;ef&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f0&nbsp;&nbsp;f0&nbsp;f1&nbsp;f2&nbsp;f3&nbsp;f4&nbsp;f5&nbsp;f6&nbsp;f7&nbsp;f8&nbsp;f9&nbsp;fa&nbsp;fb&nbsp;fc&nbsp;fd&nbsp;fe&nbsp;ff&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;100&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;1&nbsp;&nbsp;2&nbsp;&nbsp;3&nbsp;&nbsp;4&nbsp;&nbsp;5&nbsp;&nbsp;6&nbsp;&nbsp;7&nbsp;&nbsp;8&nbsp;&nbsp;9&nbsp;&nbsp;a&nbsp;&nbsp;b&nbsp;&nbsp;c&nbsp;&nbsp;d&nbsp;&nbsp;e&nbsp;&nbsp;f&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;110&nbsp;&nbsp;10&nbsp;11&nbsp;12&nbsp;13&nbsp;14&nbsp;15&nbsp;16&nbsp;17&nbsp;18&nbsp;19&nbsp;1a&nbsp;1b&nbsp;1c&nbsp;1d&nbsp;1e&nbsp;1f&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;120&nbsp;&nbsp;20&nbsp;21&nbsp;22&nbsp;23&nbsp;24&nbsp;25&nbsp;26&nbsp;27&nbsp;28&nbsp;29&nbsp;2a&nbsp;2b&nbsp;2c&nbsp;2d&nbsp;2e&nbsp;2f&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;130&nbsp;&nbsp;30&nbsp;31&nbsp;32&nbsp;33&nbsp;34&nbsp;35&nbsp;36&nbsp;37&nbsp;38&nbsp;39&nbsp;3a&nbsp;3b&nbsp;3c&nbsp;3d&nbsp;3e&nbsp;3f&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;140&nbsp;&nbsp;40&nbsp;41&nbsp;42&nbsp;43&nbsp;44&nbsp;45&nbsp;46&nbsp;47&nbsp;48&nbsp;49&nbsp;4a&nbsp;4b&nbsp;4c&nbsp;4d&nbsp;4e&nbsp;4f&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;150&nbsp;&nbsp;50&nbsp;51&nbsp;52&nbsp;53&nbsp;54&nbsp;55&nbsp;56&nbsp;57&nbsp;58&nbsp;59&nbsp;5a&nbsp;5b&nbsp;5c&nbsp;5d&nbsp;5e&nbsp;5f&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;160&nbsp;&nbsp;60&nbsp;61&nbsp;62&nbsp;63&nbsp;64&nbsp;65&nbsp;66&nbsp;67&nbsp;68&nbsp;69&nbsp;6a&nbsp;6b&nbsp;6c&nbsp;6d&nbsp;6e&nbsp;6f&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;170&nbsp;&nbsp;70&nbsp;71&nbsp;72&nbsp;73&nbsp;74&nbsp;75&nbsp;76&nbsp;77&nbsp;78&nbsp;79&nbsp;7a&nbsp;7b&nbsp;7c&nbsp;7d&nbsp;7e&nbsp;7f&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;180&nbsp;&nbsp;80&nbsp;81&nbsp;82&nbsp;83&nbsp;84&nbsp;85&nbsp;86&nbsp;87&nbsp;88&nbsp;89&nbsp;8a&nbsp;8b&nbsp;8c&nbsp;8d&nbsp;8e&nbsp;8f&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;190&nbsp;&nbsp;90&nbsp;91&nbsp;92&nbsp;93&nbsp;94&nbsp;95&nbsp;96&nbsp;97&nbsp;98&nbsp;99&nbsp;9a&nbsp;9b&nbsp;9c&nbsp;9d&nbsp;9e&nbsp;9f&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1a0&nbsp;&nbsp;a0&nbsp;a1&nbsp;a2&nbsp;a3&nbsp;a4&nbsp;a5&nbsp;a6&nbsp;a7&nbsp;a8&nbsp;a9&nbsp;aa&nbsp;ab&nbsp;ac&nbsp;ad&nbsp;ae&nbsp;af&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1b0&nbsp;&nbsp;b0&nbsp;b1&nbsp;b2&nbsp;b3&nbsp;b4&nbsp;b5&nbsp;b6&nbsp;b7&nbsp;b8&nbsp;b9&nbsp;ba&nbsp;bb&nbsp;bc&nbsp;bd&nbsp;be&nbsp;bf&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1c0&nbsp;&nbsp;c0&nbsp;c1&nbsp;c2&nbsp;c3&nbsp;c4&nbsp;c5&nbsp;c6&nbsp;c7&nbsp;c8&nbsp;c9&nbsp;ca&nbsp;cb&nbsp;cc&nbsp;cd&nbsp;ce&nbsp;cf&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1d0&nbsp;&nbsp;d0&nbsp;d1&nbsp;d2&nbsp;d3&nbsp;d4&nbsp;d5&nbsp;d6&nbsp;d7&nbsp;d8&nbsp;d9&nbsp;da&nbsp;db&nbsp;dc&nbsp;dd&nbsp;de&nbsp;df&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1e0&nbsp;&nbsp;e0&nbsp;e1&nbsp;e2&nbsp;e3&nbsp;e4&nbsp;e5&nbsp;e6&nbsp;e7&nbsp;e8&nbsp;e9&nbsp;ea&nbsp;eb&nbsp;ec&nbsp;ed&nbsp;ee&nbsp;ef&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1f0&nbsp;&nbsp;f0&nbsp;f1&nbsp;f2&nbsp;f3&nbsp;f4&nbsp;f5&nbsp;f6&nbsp;f7&nbsp;f8&nbsp;f9&nbsp;fa&nbsp;fb&nbsp;fc&nbsp;fd&nbsp;fe&nbsp;ff&nbsp;<br /><br />----------------------------------------------------------------<br />
 楼主| computer00 发表于 2009-4-9 02:07 | 显示全部楼层

哈哈~~~如果俺当初用了您这个,那么俺将无缘学习SD卡的驱动

经过这次实验的学习,俺熟练掌握了SD卡的时序,了解了SD卡的内部结构和一些寄存器,另外还记住了几个简单的命令,<br />并使用了一次AT91SAM7的硬件SPI功能~~~~收获良多呀~~~~<br /><br />另外,俺的系统是裸奔的,并不需要移植操作系统那么麻烦~~~~~~俺以前也写过一个操作系统,每次想到要移植就很痛苦……<br />因为总有些底层的东西要去改,还不如裸奔,需要哪个模块就写哪个模块的代码来得快~~~~~~~~
armecos 发表于 2009-4-9 03:01 | 显示全部楼层

圈圈很棒的,比较多产,

我现在已经忘得差不多了,时序、寄存器、命令全都不记得了。ecos的抽象设计思路你可以借鉴一下,每次只要改动一点点或者不需要改动就能平滑移植到其他平台上。越到后面越快。没有平台,你就无法积累,做了后面丢了前面,现在有兴趣做,以后可能没那么大兴趣了,你现在的弱点是没有自己的平台,每个项目都是孤立的,没按照平台的标准设计(或者没意识到这个问题的重要性),以后不太容易实现技术积累。
 楼主| computer00 发表于 2009-4-9 09:40 | 显示全部楼层

这个SD没什么呀,我从FLASH换到SD卡,也就是换了低层函数而

首先,初始化部分换了,原来的初始化FLASH部分换了,换成了初始化SD。<br />然后再将读、写FLASH一扇区的函数换成了读、写SD卡一扇区的函数,就这么多,完事了。<br /><br />这里主要就是要实现扇区、读写。
古道热肠 发表于 2009-4-9 10:10 | 显示全部楼层

呵呵,恭喜圈圈更上一层楼.

整天见eCos晃来晃去,累不累呀.弄个完整的例子放出来,对大家也许会有用,没准那天还能记得您.您那一套平台什么的,明眼人都知道,还不是从周工那儿搬过来改改,加个OS,吹得天花乱坠,实际上没人感兴趣.
古道热肠 发表于 2009-4-9 10:15 | 显示全部楼层

俺也转贴1个网友的SD卡驱动,哈哈,Bozai的

/*************************************************************/<br />/*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SD/MMC操作函数库&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />/*&nbsp;&nbsp;环境WinAVR&nbsp;20060421&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />/*&nbsp;&nbsp;作者:Bozai(章其波)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />/*&nbsp;&nbsp;E-mail:sudazqb@163.com&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />/*&nbsp;&nbsp;2006年11月26日&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />/*************************************************************/<br />/*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FAT&nbsp;diriver&nbsp;for&nbsp;&nbsp;MiniMP3&nbsp;Player&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />/*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />/*&nbsp;Platform&nbsp;&nbsp;&nbsp;:&nbsp;AVRStudio4.12&nbsp;sp4&nbsp;+&nbsp;WinAVR20060421&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />/*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;optimize&nbsp;-0s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />/*&nbsp;Author&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;bozai(Zhang&nbsp;Qibo)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />/*&nbsp;E-mail&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;sudazqb@163.com&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />/*&nbsp;MSN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;zhangqibo_1985@hotmail.com&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />/*&nbsp;Date&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;2006-12-26&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />/*******************************************************************/<br /><br /><br /><br /><br />#include&nbsp;&ltavr/io.h&gt<br />#include&nbsp;&quot;MMC_SD.h&quot;<br /><br /><br /><br /><br />//低速模式&nbsp;&nbsp;//spi&nbsp;low&nbsp;speed<br />void&nbsp;SPI_Low(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;SPCR&nbsp;=&nbsp;&nbsp;&nbsp;_BV(SPE)|_BV(MSTR)|_BV(SPR1)|_BV(SPR0);<br />&nbsp;&nbsp;&nbsp;&nbsp;SPSR&nbsp;&=&nbsp;~_BV(SPI2X);<br />}<br /><br />//高速模式&nbsp;&nbsp;&nbsp;&nbsp;//spi&nbsp;full&nbsp;speed<br />void&nbsp;SPI_High(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;SPCR&nbsp;=&nbsp;&nbsp;_BV(SPE)|_BV(MSTR);<br />&nbsp;&nbsp;&nbsp;&nbsp;SPSR&nbsp;|=&nbsp;_BV(SPI2X);<br />}<br /><br />//端口初始化,模式初始化&nbsp;&nbsp;//port&nbsp;initialize<br />void&nbsp;SPI_Init(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;DDR_INI();<br />&nbsp;&nbsp;&nbsp;&nbsp;SPI_Low();<br />}<br /><br />//写读一个字节&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//read&nbsp;and&nbsp;write&nbsp;one&nbsp;byte<br />uint8&nbsp;SPI_WriteByte(uint8&nbsp;val)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;SPDR&nbsp;=&nbsp;val;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(!(SPSR&nbsp;&&nbsp;_BV(SPIF)));<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;SPDR;<br />}<br /><br />/*uint8&nbsp;SPI_ReadByte(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;SPDR&nbsp;=&nbsp;0xff;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(!(SPSR&nbsp;&&nbsp;_BV(SPIF)));<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;SPDR;<br />}*/<br />//sd卡初始化&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//sd&nbsp;card&nbsp;initialize<br />void&nbsp;MMC_SD_Init(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;SPI_Init();<br />&nbsp;&nbsp;&nbsp;&nbsp;SPI_CS_Deassert();<br />}<br /><br />//sd卡写命令&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//sd&nbsp;send&nbsp;command<br />uint8&nbsp;MMC_SD_SendCommand(uint8&nbsp;cmd,&nbsp;uint32&nbsp;arg)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;r1;<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;retry=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;SPI_WriteByte(0xff);<br />&nbsp;&nbsp;&nbsp;&nbsp;SPI_WriteByte(0xff);<br />&nbsp;&nbsp;&nbsp;&nbsp;SPI_WriteByte(0xff);<br />&nbsp;&nbsp;&nbsp;&nbsp;SPI_WriteByte(0xff);<br />&nbsp;&nbsp;&nbsp;&nbsp;SPI_WriteByte(0xff);<br />&nbsp;&nbsp;&nbsp;&nbsp;SPI_WriteByte(0xff);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;SPI_CS_Assert();<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;SPI_WriteByte(cmd&nbsp;|&nbsp;0x40);//分别写入命令&nbsp;&nbsp;&nbsp;&nbsp;//send&nbsp;command<br />&nbsp;&nbsp;&nbsp;&nbsp;SPI_WriteByte(arg&gt&gt24);<br />&nbsp;&nbsp;&nbsp;&nbsp;SPI_WriteByte(arg&gt&gt16);<br />&nbsp;&nbsp;&nbsp;&nbsp;SPI_WriteByte(arg&gt&gt8);<br />&nbsp;&nbsp;&nbsp;&nbsp;SPI_WriteByte(arg);<br />&nbsp;&nbsp;&nbsp;&nbsp;SPI_WriteByte(0x95);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;while((r1&nbsp;=&nbsp;SPI_WriteByte(0xff))&nbsp;==&nbsp;0xff)//等待响应,&nbsp;&nbsp;&nbsp;&nbsp;//wait&nbsp;response<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(retry++&nbsp;&gt&nbsp;100)&nbsp;break;//超时退出&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//time&nbsp;out&nbsp;error<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;SPI_CS_Deassert();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;r1;//返回状态值&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//return&nbsp;state<br />}<br /><br />//sd卡复位&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//reset&nbsp;sd&nbsp;card&nbsp;(software)<br />uint8&nbsp;MMC_SD_Reset(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;retry;<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;r1=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;retry&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;SPI_Low();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;do<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt100;i++)&nbsp;SPI_WriteByte(0xff);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1&nbsp;=&nbsp;MMC_SD_SendCommand(0,&nbsp;0);//发idle命令&nbsp;&nbsp;&nbsp;&nbsp;//send&nbsp;idle&nbsp;command<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;retry++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(retry&gt10)&nbsp;return&nbsp;1;//超时退出&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//time&nbsp;out<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;while(r1&nbsp;!=&nbsp;0x01);&nbsp;&nbsp;&nbsp;&nbsp;<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;retry&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;do<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1&nbsp;=&nbsp;MMC_SD_SendCommand(1,&nbsp;0);//发active命令&nbsp;&nbsp;&nbsp;&nbsp;//send&nbsp;active&nbsp;command<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;retry++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(retry&gt100)&nbsp;return&nbsp;1;//超时退出&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//time&nbsp;out<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;while(r1);<br />&nbsp;&nbsp;&nbsp;&nbsp;SPI_High();<br />&nbsp;&nbsp;&nbsp;&nbsp;r1&nbsp;=&nbsp;MMC_SD_SendCommand(59,&nbsp;0);//关crc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//disable&nbsp;CRC<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;r1&nbsp;=&nbsp;MMC_SD_SendCommand(16,&nbsp;512);//设扇区大小512&nbsp;&nbsp;&nbsp;&nbsp;//set&nbsp;sector&nbsp;size&nbsp;to&nbsp;512<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;//正常返回&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//normal&nbsp;return<br />}<br /><br />//读一个扇区&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//read&nbsp;one&nbsp;sector<br />uint8&nbsp;MMC_SD_ReadSingleBlock(uint32&nbsp;sector,&nbsp;uint8*&nbsp;buffer)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;r1;<br />&nbsp;&nbsp;&nbsp;&nbsp;uint16&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;retry=0;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;do<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1&nbsp;=&nbsp;MMC_SD_SendCommand(17,&nbsp;sector&lt&lt9);//读命令&nbsp;&nbsp;&nbsp;&nbsp;//read&nbsp;command<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;retry++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(retry&gt10)&nbsp;return&nbsp;1;//超时退出&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//time&nbsp;out<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;while(r1&nbsp;!=&nbsp;0x00);&nbsp;&nbsp;&nbsp;&nbsp;<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;SPI_CS_Assert();<br />&nbsp;&nbsp;&nbsp;&nbsp;//等数据的开始&nbsp;&nbsp;&nbsp;&nbsp;//wait&nbsp;to&nbsp;start&nbsp;recieve&nbsp;data<br />&nbsp;&nbsp;&nbsp;&nbsp;while(SPI_WriteByte(0xff)&nbsp;!=&nbsp;0xfe);//if(retry++&nbsp;&gt&nbsp;50){SPI_CS_Deassert();return&nbsp;1;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;&nbsp;i&lt512;&nbsp;i++)//读512个数据&nbsp;&nbsp;&nbsp;&nbsp;//read&nbsp;512&nbsp;bytes<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*buffer++&nbsp;=&nbsp;SPI_WriteByte(0xff);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;SPI_WriteByte(0xff);//伪crc<br />&nbsp;&nbsp;&nbsp;&nbsp;SPI_WriteByte(0xff);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;SPI_CS_Deassert();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />}<br /><br /><br />//写一个扇区&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//wirite&nbsp;one&nbsp;sector&nbsp;//not&nbsp;used&nbsp;in&nbsp;this&nbsp;application<br />uint8&nbsp;MMC_SD_WriteSingleBlock(uint32&nbsp;sector,&nbsp;uint8*&nbsp;buffer)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;r1;<br />&nbsp;&nbsp;&nbsp;&nbsp;uint16&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;retry=0;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;do<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1&nbsp;=&nbsp;MMC_SD_SendCommand(24,&nbsp;sector&lt&lt9);//写命令&nbsp;&nbsp;&nbsp;&nbsp;//send&nbsp;command<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;retry++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(retry&gt10)&nbsp;return&nbsp;1;//超时退出&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//time&nbsp;out<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;while(r1&nbsp;!=&nbsp;0x00);&nbsp;&nbsp;&nbsp;&nbsp;<br /><br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;SPI_CS_Assert();<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;SPI_WriteByte(0xff);<br />&nbsp;&nbsp;&nbsp;&nbsp;SPI_WriteByte(0xff);<br />&nbsp;&nbsp;&nbsp;&nbsp;SPI_WriteByte(0xff);<br />&nbsp;&nbsp;&nbsp;&nbsp;SPI_WriteByte(0xff);<br />&nbsp;&nbsp;&nbsp;&nbsp;SPI_WriteByte(0xff);<br />&nbsp;&nbsp;&nbsp;&nbsp;SPI_WriteByte(0xff);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;SPI_WriteByte(0xfe);//发开始符&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//send&nbsp;start&nbsp;byte<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;&nbsp;i&lt512;&nbsp;i++)//送512字节数据&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//send&nbsp;512&nbsp;bytes&nbsp;data<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SPI_WriteByte(*buffer++);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;SPI_WriteByte(0xff);<br />&nbsp;&nbsp;&nbsp;&nbsp;SPI_WriteByte(0xff);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;r1&nbsp;=&nbsp;SPI_WriteByte(0xff);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;(r1&0x1f)&nbsp;!=&nbsp;0x05)//等待是否成功&nbsp;&nbsp;&nbsp;&nbsp;//judge&nbsp;if&nbsp;it&nbsp;successful<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SPI_CS_Deassert();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;r1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;//等待操作完&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//wait&nbsp;no&nbsp;busy<br />&nbsp;&nbsp;&nbsp;&nbsp;while(!SPI_WriteByte(0xff));//if(retry++&nbsp;&gt&nbsp;50){SPI_CS_Deassert();return&nbsp;1;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;SPI_CS_Deassert();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />}<br /><br />uint32&nbsp;MMC_SD_ReadCapacity()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;r1;<br />&nbsp;&nbsp;&nbsp;&nbsp;uint16&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;uint16&nbsp;temp;<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;buffer[16];<br />&nbsp;&nbsp;&nbsp;&nbsp;uint32&nbsp;Capacity;<br />&nbsp;&nbsp;&nbsp;&nbsp;//uint8&nbsp;retry=0;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;r1&nbsp;=&nbsp;MMC_SD_SendCommand(9,&nbsp;0);//写命令&nbsp;&nbsp;&nbsp;&nbsp;//send&nbsp;command&nbsp;&nbsp;//READ&nbsp;CSD<br />&nbsp;&nbsp;&nbsp;&nbsp;if(r1&nbsp;!=&nbsp;0x00)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;r1;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;SPI_CS_Assert();<br />&nbsp;&nbsp;&nbsp;&nbsp;while(SPI_WriteByte(0xff)&nbsp;!=&nbsp;0xfe);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt16;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buffer=SPI_WriteByte(0xff);<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;SPI_WriteByte(0xff);<br />&nbsp;&nbsp;&nbsp;&nbsp;SPI_WriteByte(0xff);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;SPI_WriteByte(0xff);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;SPI_CS_Deassert();<br /><br />/*********************************/<br />//&nbsp;&nbsp;&nbsp;&nbsp;C_SIZE<br />&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;=&nbsp;buffer[6]&0x03;<br />&nbsp;&nbsp;&nbsp;&nbsp;i&lt&lt=8;<br />&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;+=&nbsp;buffer[7];<br />&nbsp;&nbsp;&nbsp;&nbsp;i&lt&lt=2;<br />&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;+=&nbsp;((buffer[8]&0xc0)&gt&gt6);<br /><br />/**********************************/<br />//&nbsp;&nbsp;C_SIZE_MULT<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;r1&nbsp;=&nbsp;buffer[9]&0x03;<br />&nbsp;&nbsp;&nbsp;&nbsp;r1&lt&lt=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;r1&nbsp;+=&nbsp;((buffer[10]&0x80)&gt&gt7);<br /><br /><br />/**********************************/<br />//&nbsp;BLOCKNR<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;r1+=2;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;temp&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(r1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp*=2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1--;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;Capacity&nbsp;=&nbsp;((uint32)(i+1))*((uint32)temp);<br /><br />/////////////////////////<br />//&nbsp;READ_BL_LEN<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;=&nbsp;buffer[5]&0x0f;<br /><br />/*************************/<br />//BLOCK_LEN<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;temp&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(i)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp*=2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i--;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />/************************/<br /><br /><br />/**************&nbsp;formula&nbsp;of&nbsp;the&nbsp;capacity&nbsp;******************/<br />//<br />//&nbsp;&nbsp;memory&nbsp;capacity&nbsp;=&nbsp;BLOCKNR&nbsp;*&nbsp;BLOCK_LEN<br />//&nbsp;&nbsp;&nbsp;&nbsp;<br />//&nbsp;&nbsp;&nbsp;&nbsp;BLOCKNR&nbsp;=&nbsp;(C_SIZE&nbsp;+&nbsp;1)*&nbsp;MULT<br />//<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C_SIZE_MULT+2<br />//&nbsp;&nbsp;&nbsp;&nbsp;MULT&nbsp;=&nbsp;2<br />//<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;READ_BL_LEN<br />//&nbsp;&nbsp;&nbsp;&nbsp;BLOCK_LEN&nbsp;=&nbsp;2<br />/**********************************************/<br /><br />//The&nbsp;final&nbsp;result<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;Capacity&nbsp;*=&nbsp;(uint32)temp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Capacity;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />}<br />
 楼主| computer00 发表于 2009-4-9 10:24 | 显示全部楼层

为了加快速度,俺用的块连续读、写命令~~~~~~~

  
armecos 发表于 2009-4-9 11:58 | 显示全部楼层

对比一下ecos的代码,就知道差距了,

ecos抽象出一个设备驱动层,对上层操作是统一的设备文件接口,在这种框架下,上层软件不用动,下面的驱动也有规范可循。命名也特别讲究,不用费脑子起名字,还能保证不重复,好记。在可移植性、可扩展性、可生产性、组件化方面圈圈没有任何考虑,还不具备平台特性。<br /><br />用平台的好处可大了,你可以在瞬间完成一个大项目,每次只要做一点点工作,功能只受限于你的想象力,可以把精力集中在创新上,避免重复劳动。<br /><br />完整的平台代码我自己都没看,太庞大了,其实没必要,思路比代码重要,谁有功夫看那一堆一堆的乏味的code。99.999%的代码抄的Linux里的,但是知道怎么抄更重要,有现成的我肯定不会自己做。
 楼主| computer00 发表于 2009-4-9 12:30 | 显示全部楼层

呵呵,俺的出发点刚好跟您的相反,俺是出于学习,而非应

就像练武功一样,只有经过千锤百炼,才能应付自如。另外,俺认为这样的嵌入式系统就应该要使用裸奔的技术。<br />只要我没做过的,就想亲自去尝试一下,别人已经做好的,俺会觉得索然无味。
xwj 发表于 2009-4-9 16:07 | 显示全部楼层

呵呵,自己DIY的最大好处就是学习

可以学得通通透透。<br /><br />当然,第一次的话有个现成代码参考下可以少走歪路,显著提高速度,但千万不要不求甚解哦;-)<br />
mindshare 发表于 2009-4-10 11:49 | 显示全部楼层

不错不错~!

To&nbsp;OO:<br />&nbsp;&nbsp;&nbsp;不错不错~!&nbsp;只有自己摸索出来的东西才有乐趣,也才能更深入的了解没一个细节.<br /><br />To&nbsp;ARMecos:<br />&nbsp;&nbsp;&nbsp;为什么一定要用ecos的代码.我是指一定~!&nbsp;每个人的情况不同,很反对这种不动脑子,就对别人说3道4的人
 楼主| computer00 发表于 2009-4-11 10:27 | 显示全部楼层

修改了一点小错误,重新上传了。

  
armecos 发表于 2009-4-12 01:20 | 显示全部楼层

其实,使用平台和你学习并不矛盾,

&nbsp;&nbsp;&nbsp;&nbsp;现在的软件复杂度上升,比如:工程量达到10000人年,10000个人做1年才能完成,你一个人需要做10000年,问题是,你能活10000年嘛,所以,全都自己做不现实。<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;解决这个问题的方法就是组件对象模型COM。比如你组装一辆汽车,不用管发动机是4缸、8缸还是12缸的,只要对外接口(安装孔位置、尺寸大小)一致,你就能直接替换,改变发动机不会影响你的其他部分,一样有DIY的乐趣。就象有些人DIY“山寨直升机”,他们的航空发动机不可能自己造,但是仍然可以体验DIY飞机的乐趣。<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;我感觉做软硬件根本目的是实现业务流程,而不是DIY本身。比如:做读卡器就是要实现读写的功能,这个功能有价值。因此了解思路比实现细节更重要,使用别人现成的成果即可以体现合作精神,又不会感觉索然无味,因为这其中最有趣味的是实现读卡器功能,了解工作原理,而不是乏味的coding,故&nbsp;用别人的现成组件又有何妨呢!
 楼主| computer00 发表于 2009-4-12 23:27 | 显示全部楼层

这个原理俺早理解了,照你这么说,俺根本不用做这个。

可是实际制作过程中往往会遇到很多让你意想不到的问题,通过不断地解决问题,这样才能让自己提高。<br />如果只想不做,或者只说不做,永远都没有意义。
armecos 发表于 2009-4-13 17:39 | 显示全部楼层

我是说在平台基础上做效果更好,没有否认DIY的好处,

在平台基础上学习才能有积累,没有平台就没有技术积累。
 楼主| computer00 发表于 2009-4-13 18:36 | 显示全部楼层

谁说的?平台也不过是代码的累积而已,特殊的裸奔系统而

裸奔代码照样可以积累。只是一些模块而已,把这些模块搭起来就行了。<br /><br />如果每次都弄个平台,系统资源消耗了不说,每次调试还累得要死,因为每修改一下进入调试状态都要等很久的加载时间啊,这等于在浪费生命。<br /><br />再说了,如果要上平台,也当然是用俺自己开发的平台了……至少自己对里面的结构熟。
jiaojinxing 发表于 2009-5-3 18:46 | 显示全部楼层

支持圈圈

平台还是用好,<br />效率有两方面,程序执行效率与程序开发效率,<br />模块化可以增强组件的重用,加快开发效率,<br />但为了做到跨平台,抽象性有时要牺牲执行效率<br />频繁地更换平台也不是一件好事<br />建议考虑rt-thread这个操作系统,它包括了内核、文件系统、网络协议栈、GUI、输入法、网页服务器、FTP服务器、Shell等<br />更重要它是基于GPL的,以后可能用BSD授权,不像ecos卖个天价,其实到底还不是人家的东西<br /><br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

247

主题

14716

帖子

213

粉丝
快速回复 在线客服 返回列表 返回顶部