1-海思ss927编译 rootfs 并成功替换

  •   error while loading shared libraries: libc.so ->  /lib64 # cp libc.so.6 libc.so  或者 ln -s libc.so.6 libc.so 即可  

 

  • 加一个新的分区:
    # ubi.mtd=4 因为 mtdparts=nand:512K(boot),512K(env),512K(bl31),13M(kernel),32M(rootfs) 文件系统在第4个索引
    bootargs=mem=128M console=ttyAMA0,115200 clk_ignore_unused root=ubi0:ubifs rootfstype=ubifs rw ubi.mtd=4 mtdparts=nand:512K(boot),512K(env),512K(bl31),13M(kernel),32M(rootfs),32M(fixed)
    bootcmd=nand read 0x40010000 0x100000 0x80000; ipcboot bl31 0x40010000; nand read 0x44000000 0x180000 0xd00000; ipcboot uimgfdt 0x44000000
    
    
    # ======
    root=ubi0:ubifs : 根文件系统的设备路径被指定为 ubi0:ubifs
    ubi.mtd=4: 告诉内核将 mtd4 分区初始化为一个 UBI 设备, UBIFS 是基于 UBI 的文件系统
  • 打包内容烧录并给新的分区: ./mkubiimg.sh fixed 2k 128k ./fixed 32M ../../../pub/bin/pc 0 
  • 把新的分区挂载到文件系统:ubiattach /dev/ubi_ctrl -m 5 ; mount -t ubifs /dev/ubi1_0 /fxw/mnt_fixed

 

  • 烧录完成后优化:默认的 文件系统目录 有默认的 ko、so、和默认的 busybox 功能
    1. 复制sdk里的ko 到 文件系统目录
      1. cp -rf /home/fx/share/sdk/SS928V100_SDK_V2.0.2.2/smp/a55_linux/mpp/out/ko usr/fx-ko-lib/sdk_smp_mpp_out_ko
    2. 复制需要的  so  到 文件系统目录
      1. cp -rf /home/fx/share/sdk/SS928V100_SDK_V2.0.2.2/smp/a55_linux/mpp/out/lib usr/fx-ko-lib/sdk_smp_mpp_out_lib
    3. 在 sdk/SS928V100_SDK_V2.0.2.2/open_source/busybox/busybox-1.31.1  目录 make menuconfig 添加新的功能,如 telnet , 然后编译, 编译完了之后把 _install 里的目录 复制到 文件系统目录下面
      1. make ARCH=arm64 CROSS_COMPILE=aarch64-mix210-linux- menuconfig
      2. make ARCH=arm64 CROSS_COMPILE=aarch64-mix210-linux- -j5
      3. make ARCH=arm64 CROSS_COMPILE=aarch64-mix210-linux- install
      4. cd /home/fx/share/sdk/SS928V100_SDK_V2.0.2.2/osdrv/pub/rootfs_glibc_arm64
      5. cp -rf /home/fx/share/sdk/SS928V100_SDK_V2.0.2.2/open_source/busybox/busybox-1.31.1/_install/bin .
      6. cp -rf /home/fx/share/sdk/SS928V100_SDK_V2.0.2.2/open_source/busybox/busybox-1.31.1/_install/linuxrc .
      7. cp -rf /home/fx/share/sdk/SS928V100_SDK_V2.0.2.2/open_source/busybox/busybox-1.31.1/_install/sbin/ .
      8. cp -rf /home/fx/share/sdk/SS928V100_SDK_V2.0.2.2/open_source/busybox/busybox-1.31.1/_install/usr/bin usr/
      9. cp -rf /home/fx/share/sdk/SS928V100_SDK_V2.0.2.2/open_source/busybox/busybox-1.31.1/_install/usr/sbin usr/
    4. 在 /etc/profile 里面设置 PATH 和 LD_LIBRARY_PATH 环境变量(由于没有用户目录,所以这些环境变量都在这里编写,不用在 .bashrc 里面)
      • /etc/profile
         # /etc/profile: system-wide .profile file for the Bourne shells
        #
        #
        
        set_path_before()
        {
                [ -d $1 ] && PATH="$1:$PATH"
        }
        
        PATH="/usr/bin:/usr/sbin:/bin:/sbin"
        set_path_before /usr/local/sbin
        set_path_before /usr/local/bin
        
        export PATH
        export LD_LIBRARY_PATH
        export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/fx-ko-lib/sdk_smp_mpp_out_lib:/usr/fx-ko-lib/sdk_smp_mpp_out_lib/npu \
        :/usr/fx-ko-lib/sdk_smp_mpp_out_lib/svp_npu
    5. /etc/init.d 里面的脚本也会开机运行,我在这里面加载 ko ,运行程序等操作
      1. /etc/init.d/S928fxw
        #!/bin/sh
        
        echo ========= run S928fxw =========
        
        CURRENT_DIR=`pwd`
        
        # pushd /usr/fx-ko-lib/sdk_smp_mpp_out_ko/; ./load_ss928v100 -i; popd # pushd、popd 识别不了
        cd /usr/fx-ko-lib/sdk_smp_mpp_out_ko/; ./load_ss928v100 -i; cd $CURRENT_DIR
        
        # 这里请在 busybox 里面打开,并复制到文件系统目录
        telnetd &
    6. 修改网络配置文件/etc/init.d/S80network
      1. /etc/init.d/S80network
         #!/bin/sh
        
        ipaddr=192.168.50.208
        bootp=
        gateway=192.168.50.1
        netmask=255.255.255.0
        hostname=ss927
        netdev=eth0
        autoconf=
        
        for ipinfo in `cat /proc/cmdline`
        do
        	case "$ipinfo" in
        	ip=*)
        		for var in  ipaddr bootp gateway netmask hostname netdev autoconf
        		do
        			eval read $var
        		done << EOF
        		`echo "$ipinfo" | sed "s/:/\n/g" | sed "s/^[ 	]*$/-/g"`
        EOF
        		ipaddr=`echo "$ipaddr" | cut -d = -f 2`
        		[ x$ipaddr == x ] && ipaddr=x
        		;;
        	esac
        done
        
        [ -z "$ipaddr" ] && exit 0
        
        echo "      IP: $ipaddr"
        echo "   BOOTP: $bootp"
        echo " GATEWAY: $gateway"
        echo " NETMASK: $netmask"
        echo "HOSTNAME: $hostname"
        echo "  NETDEV: $netdev"
        echo "AUTOCONF: $autoconf"
        
        if [ x$ipaddr == x- ] ; then
        	# use DHCP
        	:
        else
        	cmd="ifconfig $netdev $ipaddr"
        	[ x$netmask != x- ] && cmd="$cmd netmask $netmask"
        	eval $cmd
        	[ x$gateway != x- ] && route add default gw $gateway
        fi
        
        ifconfig lo 127.0.0.1

 

  • 文件系统的目录: sdk/SS928V100_SDK_V2.0.2.2/osdrv/pub/rootfs_glibc_arm64 , 这个目录就是文件系统的目录, 就是想办法把这些目录压缩成 .ubifs  格式,然后烧录到板端就好了
  • 压缩文件系统目录的脚本:sdk/SS928V100_SDK_V2.0.2.2/osdrv/tools/pc/ubi_sh , 这个目录下有压缩文件系统的脚本:mkubiimg.sh
    • 执行压缩命令:/mkubiimg.sh ss927v100 2k 128k /home/fx/share/sdk/SS928V100_SDK_V2.0.2.2/osdrv/pub/rootfs_glibc_arm64 64M /home/fx/share/sdk/SS928V100_SDK_V2.0.2.2/osdrv/pub/bin/pc 0 ,其实每个参数在同目录的 readme.txt 都有解释,这里我用自己的理解说一下:
      • ss927v100: 就是一个生成后的目标用于识别的名字,应该可以随便写
      • 2k: NAND page size. 2k/4k/8k.  // 根据 flash 决定
      • 128k: NAND block size. 128k/256k/1M // 根据 falsh 决定
      • /home/fx/share/sdk/SS928V100_SDK_V2.0.2.2/osdrv/pub/rootfs_glibc_arm64:就是你要压缩的文件系统的目录的位置
      • 64M:NAND中的分区大小 // 这个就是文件系统的大小,这个越大启动就越慢一点
      • /home/fx/share/sdk/SS928V100_SDK_V2.0.2.2/osdrv/pub/bin/pc:  mkfs.ubifs 生成的路径,但是我最终生成的 rootfs_ss927v100_2k_128k_64M.ubifs 就在我的脚本同目录下
      • 0: 同时保留ubiimg和ubifs(1:是  0:否(默认))
    • 执行完成后 在脚本的同目录下 生成有  rootfs_ss927v100_2k_128k_64M.ubifs
  • 现在得到了压缩的 文件系统目录的文件了,要考虑怎么把它烧录到板端了?
    • 打开烧录工具,选择按分区烧录:
      • 分区表.xml
         
        <?xml version="1.0" encoding="GB2312" ?>
        <Partition_Info ProgrammerFile="">
        <Part Sel="1" PartitionName="fastboot" FlashType="nand" FileSystem="none" Start="0" Length="1M" SelectFile="C:\Users\lin\Desktop\新建文件夹 (3)\boot_image.bin"/>
        <Part Sel="1" PartitionName="" FlashType="nand" FileSystem="none" Start="1M" Length="15M" SelectFile="C:\Users\lin\Desktop\新建文件夹 (3)\fip.bin"/>
        <Part Sel="1" PartitionName="" FlashType="nand" FileSystem="none" Start="16M" Length="-" SelectFile="C:\Users\lin\Desktop\新建文件夹 (3)\rootfs_ss928v100_2k_128k_128M.ubifs"/>
        </Partition_Info>
      • 按照这个分区表,把 uboot、kernel、rootfs 都烧录一遍,由于 uboot 还是用的朴工的,所以 uboot 传递给 kernel的参数要手动改一下,改成向分区表一样:

        • 修改 uboot 传递给 kernel 参数
           朴工的uboot信息:
          printenv:
          bootargs=mem=512M console=ttyAMA0,115200 clk_ignore_unused ubi.mtd=2 root=ubi0:rootfs rootfstype=ubifs rw mtdparts=nand:2M(boot),12M(kernel),32M(rootfs),64M(usrfs),8M(dss),-(reserve)
          bootcmd=nand read 0x50000000 0x200000 0xc00000;bootm 0x50000000
          bootdelay=1
          bootfile="uImage"
          
          自己修改的:
          setenv bootargs 'mem=512M console=ttyAMA0,115200 tee_enable clk_ignore_unused ubi.mtd=2 root=ubi0:ubifs rootfstype=ubifs rw mtdparts=nand:1M(uboot),15M(kernel),-(rootfs)';
          setenv bootcmd 'nand read 0x42000000 0x100000 0xf00000;bootm 0x42000000';
          sa
          re
          
          # 0x100000 是1MiB(5个0) 、 0x80000 是 512KiB(4个0)
          # rw mtdparts=nand:1M(uboot),15M(kernel),-(rootfs) : 这里只有 3个分区了,和分区表一致,朴工的有好几个分区
          # nand read 0x42000000 0x100000 0xf00000: 从0x100000地址开始读取 0xf00000 大小到0x42000000, 就是从 1m的地方开始读取 15m 到  0x42000000
          # bootm 0x42000000:运行 0x42000000 地方的程序
          
          #其它参数
          # md.b 0x44000000 64; // 输出64个log 信息, 如:setenv bootcmd 'nand read 0x44000000 0x100000 0xc00000; md.b 0x44000000 64; bootm 0x44000000 - 0x45000000'
          # debug 输入更多信息如:setenv bootargs 'mem=128M console=ttyAMA0,115200 debug  root=ubi0:ubifs ...

 

posted @ 2024-11-22 20:31  封兴旺  阅读(90)  评论(0)    收藏  举报

联系方式: 18274305123(微信同号)