i.MX6 보드에 있는 eMMC 스토리지의 mmc hw파티션에 U-Boot가 포함된 Linux 커널을 작성하고 싶습니다.
TX6UL U-Boot > mmc info
Device: FSL_SDHC
Manufacturer ID: 11
OEM: 100
Name: 004G6
Tran Speed: 52000000
Rd Block Len: 512
MMC version 5.0
High Capacity: Yes
Capacity: 8 MiB
Bus Width: 4-bit
Erase Group Size: 4 MiB
HC WP Group Size: 4 MiB
User Capacity: 8 MiB WRREL
Boot Capacity: 2 MiB ENH
RPMB Capacity: 512 KiB ENH
GP1 Capacity: 8 MiB WRREL
GP2 Capacity: 1.8 GiB ENH WRREL
일반 hwpartition GP1은 커널과 함께 사용하도록 고안되었습니다. 일반적으로 다음 명령을 사용하여 이미지를 작성합니다(tftp 서버가 실행 중이고 이미지가 uImage_txul 파일로 호스팅된다고 가정).
TX6UL U-Boot > tftp ${loadaddr} uImage_txul
TX6UL U-Boot > mmc write ${loadaddr} 0xXXXX 0xYYYY
hwpartition GP1에 이미지를 쓰는 데 필요한 주소 0xXXXX 0xYYYY를 어떻게 찾을 수 있나요?
답변1
mmc에 대한 플래시 u-boot에 대한 짧은 대답은 아마도
tftp ${loadaddr} u-boot.bin
mmc partconf 0 ${emmc_boot_ack} ${emmc_boot_part} 1
mmc write ${fileaddr} 0 800
mmc partconf 0 ${emmc_boot_ack} ${emmc_boot_part} 0
하지만 mmc를 어떻게 설정하느냐에 따라 다릅니다. 이 명령은 ${fileaddr}의 1048576(0x800 * 512) 바이트를 주소 0에서 시작하여 mmc에 씁니다.
mmc 작성에 대한 더 길고 완전한 답변입니다. 제조업체가 권장하는 방식으로 MMC를 설정한다고 가정해 보겠습니다.
| u-boot[0] | DT[0x680] | Kernel[0x800] | FS[0x8000] |
필요한 파일이 이미 있다고 가정합니다. 그렇지 않은 경우 Yocto를 사용하여 해당 파일을 빌드할 수 있습니다. 원하시면 세부정보를 제공해 드릴 수 있습니다.
u-boot.bin, imx6ul-txul-0011.dtb, uImage, rootfs.tar.bz2, modules.tgz
또한 최소한 u-boot를 사이드로드했다고 가정하면 어떻게든 실행 중인 것처럼 보입니다.
먼저 mmc를 분할해야 합니다. u-boot를 통해서는 이 작업을 수행할 수 없으므로 네트워크 부팅을 설정해야 합니다. 파일이 포함된 tftp 서버가 이미 있는 것 같습니다. 또한 nfs 서버를 설정하고 거기에서 rootfs를 추출해야 합니다. /nfsroot에 nfs 서버 파일 시스템을 설정했다고 가정합니다. 네트워크 부팅을 활성화하려면 다음 변수를 설정하십시오.
env default -a
env set bootdelay 3
env set serverip 192.168.1.99
env set nfs_server 192.168.1.99
env set ipaddr 192.168.1.90
env set netmask 255.255.255.0
env set bootfile uImage
env set nfsroot /nfsroot
env set boot_mode net
env set default_bootargs setenv bootargs init=/bin/sh console=ttymxc0,115200 ro debug panic=1 ${append_bootargs}
save
Linux 프롬프트로 부팅하고 거기서 실행하세요.
fdisk /dev/mmcblk0
파티션을 다음과 같이 설정하십시오
Partition Start Cyl End Cyl Start Sector End Sector Type
1 33 512 2048 32767 0x0c
2 513 - 32768 - 0x83
u-boot로 다시 전환하면 이제 파티션을 볼 수 있습니다.
> mmc part
Partition Map for MMC device 0 -- Partition Type: DOS
Part Start Sector Num Sectors UUID Type
1 2048 30720 00ee66ee-01 0c
2 32768 7700480 00ee66ee-02 83
파티션 1은 섹터 2048(0x800)에서 시작됩니다. 파티션 2는 32768(0x8000)에서 시작합니다. 이제 이 숫자가 어디서 왔는지 알아야 합니다.
위의 명령을 사용하여 u-boot.bin을 업데이트했는데, 장치 테이블(DT)도 덮어쓰게 되니 주의하시기 바랍니다. 따라서 DT를 업데이트하려면 다음을 사용하십시오.
tftp ${fdtaddr} imx6ul-txul-0011.dtb
mmc partconf 0 ${emmc_boot_ack} ${emmc_boot_part} 1
mmc write ${fdtaddr} 0x680 80
mmc partconf 0 ${emmc_boot_ack} ${emmc_boot_part} 0
이러한 명령을 사용하여 환경 변수를 설정할 수도 있습니다.${fdtsave}, 그렇다면 사용할 수 있습니다
run fdtsave
파티션을 업데이트하려면 Linux 시스템에서 디스크 이미지를 생성한 다음 이를 TX6UL로 tftp하고 mmc write 명령을 사용하여 구워야 합니다. 첫 번째 파티션을 이미지화하려면 Linux 시스템에서 다음 명령을 사용할 수 있습니다.
dd if=/dev/zero of=part1.image bs=15728640 count=0 seek=1
/sbin/mkfs -t vfat part1.image
sudo mkdir /mnt/mkpart
sudo mount -o loop part1.image /mnt/mkpart
cp uImage /mnt/mkpart/uImage
sudo umount /mnt/mkpart
그런 다음 u-boot에서
tftp ${loadaddr} part1.image
mmc write ${fileaddr} 800 7800
u-boot를 사용하여 파티션의 내용을 볼 수 있습니다
> fatls mmc 0:1
3676512 uimage
1 file(s), 0 dir(s)
마찬가지로 두 번째 파티션의 경우 Linux 상자에서 다음과 같은 것을 사용하십시오.
dd if=/dev/zero of=part2.image bs=64M count=0 seek=1
/sbin/mkfs -t ext3 part2.image
sudo mkdir /mnt/mkpart
sudo mount -o loop part2.image /mnt/mkpart
sudo tar -C /mnt/mkpart -xjf rootfs.tar.bz2
sudo tar -C /mnt/mkpart -xzf modules.tgz
ln -s sbin/init /mnt/mkpart/linuxrc
sudo umount /mnt/mkpart
그런 다음 u-boot에서
tftp ${loadaddr} part2.image
setexpr fs ${filesize} + 1ff
setexpr fs ${fs} / 200
mmc write ${fileaddr} 8000 ${fs}
u-boot에서 두 번째 파티션의 내용을 보려면
> ext2ls mmc 0:2
새 파티션에서 부팅하려면 부팅 매개변수에서 init를 다시 일반으로 설정하세요.
env set default_bootargs setenv bootargs init=/linuxrc console=ttymxc0,115200 ro debug panic=1 ${append_bootargs}
save
그리고 새 파일 시스템을 가리키도록 파티션 ID나 env 변수를 변경하는 것을 잊지 마세요. 이 경우
env set rootpart_uuid 00ee66ee-02
save
도움이 되었기를 바랍니다.