SMP865X-yamon-satadisk readdma解释

来源:互联网 发布:linux 挂起进程 编辑:程序博客网 时间:2024/05/20 03:47

作者mail: agooou@gmail.com

smp8652, smp8653, smp8654, smp8655

SMP865X上yamon中satadisk的语法为:
satadisk [-f] (id [sd0|sd1])|
     (readdma  sd0|sd1 <sector> <count> <addr> <max sectors in DMA>)|
     (writedma sd0|sd1 <sector> <count> <addr> <max sectors in DMA>)
对于readdma,
    sd0|sd1表示哪个sata接口,smp8652上只有一个sata接口,所以应该使用sd0。
    <sector>表示开始读的存储扇区。每个扇区一般为512字节。
    <count>表示要读的扇区个数。
    <addr>表示要读到的内存地址
    <max sectors in DMA>表示要DMA一次读的大小,这个好像是固定的,128。
例子:
    satadisk readdma sd0 63 256 0xb0100000 128;
    echo Writing PHY to NAND;
    将sata上PHY内容写入到NAND中。为什么sector是从63开始呢?因为我们用fdisk对sata进行分区时,第一个分区是从track1开始的,而不是从track0,每一个track为63个sector。而我们写sata启动盘的时候是从第一个分区的0地址开始写,就相当于我们从整个硬盘的track1开始写,也就是从sector63开始写。所以,我们读的时候就要从整个硬盘的sector63开始读。

分析历程:
    平时经常使用fdisk进行分区,分完区后就认为第一个分区是从磁盘的0地址开始的,然后依次类推。
    后来,使用linux和windows双系统的时候,遇到了问题。windows系统不知咋的挂了,用系统盘去恢复,恢复完了,windows是能进去,但没有grub启动画面了,进不了linux了。之后明白,是windows安装程序把mbr改了。之后用linux恢复盘进去重新恢复mbr就可以了。
    再后来,在做SMP865X-sata启动的时候,准备在yamon下,把sata数据烧进nand,发现烧写nand的代码比较怪异(代码附后)。satadisk readdma是从sata中读取数据,sd0表示sata名字,接着后面63就怪了。为什么是这么一个数字呢?
    我把sata查到笔记本上用fdisk看,sudo fdisk /dev/sdb, p一下,发现start是1,猜测一下,如果0是起始值的话,那么1代表的应该是8M,不大可能。
   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1   *           1          17      136521   83  Linux
/dev/sdb2              18         243     1815345   83  Linux
    后来想到fdisk的高级功能,x进入,然后按p,打印出详细信息。这次再看发现start是63,对比总数3630690一算,发现是31.5K字节,刚好合适。据此看出第一个分区是从sector63开始。
Disk /dev/sdb: 255 heads, 63 sectors, 243 cylinders
Nr AF  Hd Sec  Cyl  Hd Sec  Cyl     Start      Size ID
 1 80   1   1    0 254  63   16         63     273042 83
 2 00   0   1   17 254  63  242     273105    3630690 83
 3 00   0   0    0   0   0    0          0          0 00
 4 00   0   0    0   0   0    0          0          0 00


    SMP865X中将sata内容烧写到nand中的程序。
satadisk readdma sd0 63 256 0xb0100000 128; nflash erase -p 0 0x100000 0; echo Formating the NAND ...; nflash format 0; satadisk readdma sd0 23103 256 0xb0100000 128; echo Writing PHY to NAND; nflash write -p 0 0xb0100000 0x20000 0; echo Read YAMON from SATA Disk; satadisk readdma sd0 23359 512 0xb0100000 128; echo Writing YAMON to NAND; nflash write 0x80000 0xb0100000 0x40000 0; echo Read Linux From SATA Disk; satadisk readdma sd0 23871 20480 0xb0100000 128; echo Writing Linux to NAND; nflash write 0xc0000 0xb0100000 0xa00000 0; echo Writing Backup Linux to NAND; nflash write 0xac0000 0xb0100000 0xa00000 0; nflash format 0; echo NAND Initialization finshed!; echo Now reboot the system; reboot

原创粉丝点击