海思 HI 35xx u-boot+kernel+rootfs移植

PC端开发环境安装:

sudo ./sdk.unpack

报如下错误:

./sdk.unpack: 7: ./sdk.unpack: WARN: not found

./sdk.unpack: 8: ./sdk.unpack: ECHO: not found

./sdk.unpack: 20: ./sdk.unpack: ECHO: not found

./sdk.unpack: 22: ./sdk.unpack: run_command_progress_float: not found

./sdk.unpack: 24: ./sdk.unpack: ECHO: not found

./sdk.unpack: 26: ./sdk.unpack: run_command_progress_float: not found

./sdk.unpack: 28: ./sdk.unpack: ECHO: not found

./sdk.unpack: 30: ./sdk.unpack: run_command_progress_float: not found

./sdk.unpack: 32: ./sdk.unpack: ECHO: not found

./sdk.unpack: 34: ./sdk.unpack: run_command_progress_float: not found

原因和3531一样,修改sdk.unpack文件,将首行的 #!/bin/sh 改为 #!/bin/bash 运行OK。

uclibc:

uclibc = Micro library

一个小型的C语言标准库,主要用于嵌入式。

其最开始设计用于uClinux(注:uClinux不支持MMU),因此比较适用于微处理器中。

对应的,此处的u意思是μ,Micro,微小的意思。

uClibc的特点:

(1)uClibc比glibc要小很多。

(2)uClibc是独立的,为了应用于嵌入式系统中,完全重新实现出来的。和glibc在源码结构和二进制上,都不兼容。

glibc:

glibc = GNU C library

是GNU项(GNU Project)目,所实现的 C语言标准库(C standard library)。

目前,常见的桌面和服务器中的GNU/Linux类的系统中,都是用的这套C语言标准库。

其实现了常见的C库的函数,支持很多种系统平台,功能很全,但是也相对比较臃肿和庞大。

1)安装uclibc交叉编译器(注意,需要有sudo权限或者root权限):

       进入hi3520D_SDK_Vx.x.x.x/osdrv/toolchain/arm-hisiv100nptl-linux目录,运行chmod +x cross.install,然后运行./cross.install即可。

2) 安装glibc交叉编译器(注意,需要有sudo权限或者root权限,暂时不支持glibc版本):

       进入hi3520D_SDK_Vx.x.x.x/osdrv/toolchain/arm-hisiv200-linux目录,运行chmod +x cross.install,然后运行./cross.install即可。

 3) 执行source /etc/profile, 安装交叉编译器的脚本配置的环境变量就可以生效了,或者请重新登陆也可。

 

板载开发环境搭建:

/bin/sh: 1: ./configure: not found

发现系统的/bin/sh的映射有问题,于是修改系统配置:

运行:

sudo dpkg-reconfigure dash

出现:

 

选择NO,确认。

重新编译。

/home/ubuntu/Work/Hi/3520/Hi3520D_SDK_V2.0.5.1/osdrv/kernel/linux-3.0.y /home/ubuntu/Work/Hi/3520/Hi3520D_SDK_V2.0.5.1/osdrv

Can't use 'defined(@array)' (Maybe you should just omit the defined()?) at kernel/timeconst.pl line 373.

提示不能使用defined(@array),应该忽略掉它。

我们找到这个文件osdrv/kernel/linux-3.0.y/kernel/timeconst.pl。打开文件,找到这个defined(@array)。

修改 if (!defined(@val)) if (!@val) 后依然报错,结果查看发现,当重新make之后,这个文件又变为之前的了。

执行:make ARCH=arm CROSS_COMPILE=arm-hisiv100nptl-linux- menuconfig

报错:

 *** Unable to find the ncurses libraries or the

 *** required header files.

 *** 'make menuconfig' requires the ncurses libraries.

 ***

 *** Install ncurses (ncurses-devel) and try again.

 ***

提示没有 ncurses 库。

使用命令安装库:

Reading package lists... Done

Building dependency tree      

Reading state information... Done

E: Unable to locate package ncurses-devel

提示不能安装到本地。

重新安装:

sudo apt-get install libncurses5-dev

安装成功,测试:sudo make menuconfig 命令 OK 。

再次编译kernel报错:

"mkimage" command not found - U-Boot images will not be built

/home/ubuntu/Work/Hi/3520/Hi3520D_SDK_V2.0.5.1/osdrv/kernel/linux-3.0.y/arch/arm/boot/Makefile:76: recipe for target 'arch/arm/boot/uImage' failed

make[1]: *** [arch/arm/boot/uImage] Error 1

/home/ubuntu/Work/Hi/3520/Hi3520D_SDK_V2.0.5.1/osdrv/kernel/linux-3.0.y/arch/arm/Makefile:288: recipe for target 'uImage' failed

make: *** [uImage] Error 2

安装这个工具解决:

apt-get install u-boot-tools

现在可以在arch/arm/boot下面找到生成的image文件。

根据osdrv/readme_cn.txt操作步骤编译uboot成功。

Can't use 'defined(@array)' (Maybe you should just omit the defined()?) at kernel/timeconst.pl line 373.

和第一次安装的时候报错一样,但是单独编译kernel的时候却没问题,说明很可能是Makefile的问题。

打开Makefile确定问题原因:

#rm $(OSDRV_DIR)/kernel/linux-3.0.y -rf

#tar xzf $(OSDRV_DIR)/kernel/linux-3.0.y.tgz -C $(OSDRV_DIR)/kernel/

确定问题原因,因为每次在编译kernel的时候,Makefile都会重新解压一份kernel,然后使用解压的kernal进行编译,这样我之前修改的文件就会被覆盖掉。屏蔽这个两行内容,重新编译。

mv /home/ubuntu/Work/Hi/3520/Hi3520D_SDK_V2.0.5.1/osdrv/pub/rootfs /home/ubuntu/Work/Hi/3520/Hi3520D_SDK_V2.0.5.1/osdrv/pub/rootfs_uclibc

tar xzf /home/ubuntu/Work/Hi/3520/Hi3520D_SDK_V2.0.5.1/osdrv/toolchain/arm-hisiv100nptl-linux/runtime_lib/armv7a_soft/lib.uClibc.tgz \

-C /home/ubuntu/Work/Hi/3520/Hi3520D_SDK_V2.0.5.1/osdrv/pub/rootfs_uclibc

tar xzf /home/ubuntu/Work/Hi/3520/Hi3520D_SDK_V2.0.5.1/osdrv/toolchain/arm-hisiv100nptl-linux/runtime_lib/armv7a_soft/lib.stdc++.tgz \

-C /home/ubuntu/Work/Hi/3520/Hi3520D_SDK_V2.0.5.1/osdrv/pub/rootfs_uclibc

rm /home/ubuntu/Work/Hi/3520/Hi3520D_SDK_V2.0.5.1/osdrv/pub/rootfs_uclibc/etc/init.d/S81toe

rm: cannot remove '/home/ubuntu/Work/Hi/3520/Hi3520D_SDK_V2.0.5.1/osdrv/pub/rootfs_uclibc/etc/init.d/S81toe': No such file or directory

Makefile:199: recipe for target 'hirootfs_prepare' failed

make: *** [hirootfs_prepare] Error 1

根据提示,在/pub/rootfs_uclibc/etc/init.d/文件夹下创建S81toe文件,再次编译。

---------task [3] prepare rootfs

tar xzf /home/ubuntu/Work/Hi/3520/Hi3520D_SDK_V2.0.5.1/osdrv/rootfs_scripts/rootfs.tgz -C /home/ubuntu/Work/Hi/3520/Hi3520D_SDK_V2.0.5.1/osdrv/pub

mv /home/ubuntu/Work/Hi/3520/Hi3520D_SDK_V2.0.5.1/osdrv/pub/rootfs /home/ubuntu/Work/Hi/3520/Hi3520D_SDK_V2.0.5.1/osdrv/pub/rootfs_uclibc

mv: cannot move '/home/ubuntu/Work/Hi/3520/Hi3520D_SDK_V2.0.5.1/osdrv/pub/rootfs' to '/home/ubuntu/Work/Hi/3520/Hi3520D_SDK_V2.0.5.1/osdrv/pub/rootfs_uclibc/rootfs': Directory not empty

Makefile:197: recipe for target 'hirootfs_prepare' failed

make: *** [hirootfs_prepare] Error 1

这次是在rootfs的时候遇到了问题。

根据提示,我将/rootfs_uclibc/rootfs文件夹删除了,然后编译后报错:

在编译到busybox的时候报错如下:

make -C /home/ubuntu/Work/Hi/3520/Hi3520D_SDK_V2.0.5.1/osdrv/busybox/busybox-1.16.1 install

make[1]: Entering directory '/home/ubuntu/Work/Hi/3520/Hi3520D_SDK_V2.0.5.1/osdrv/busybox/busybox-1.16.1'

Makefile:1279: *** mixed implicit and normal rules: deprecated syntax

/home/ubuntu/Work/Hi/3520/Hi3520D_SDK_V2.0.5.1/osdrv/busybox/busybox-1.16.1/Makefile:431: *** mixed implicit and normal rules: deprecated syntax

/home/ubuntu/Work/Hi/3520/Hi3520D_SDK_V2.0.5.1/osdrv/busybox/busybox-1.16.1/Makefile:1279: *** mixed implicit and normal rules: deprecated syntax

make[2]: *** No rule to make target 'silentoldconfig'.  Stop.

Makefile:508: recipe for target 'include/autoconf.h' failed

make[1]: *** [include/autoconf.h] Error 2

经查找,发现是因为我们使用的Make工具版本太新,对老的规则不兼容。

修改/osdrv/busybox/busybox-1.16.1/Makefile:431行:

将:config %config: scripts_basic outputmakefile FORCE

改为:%config: scripts_basic outputmakefile FORCE

编译后OK。

注意:这里我们的主Makefile也会先解压busybox然后再编译,因此,再修改完Makefile文件后,要将/osdrv/Makefile中的解压busybox的部分删除掉。否则依旧会报错。

1、配置tftp服务器

    # 可以使用任意的tftp服务器,将package/image_uclibc(或image_glibc)下的相关文件拷贝到tftp服务器目录下。

   

2、参数配置

    # 单板上电后,敲任意键进入u-boot。设置serverip(即tftp服务器的ip)、ipaddr(单板ip)和ethaddr(单板的MAC地址)。

    setenv serverip xx.xx.xx.xx

    setenv ipaddr xx.xx.xx.xx

    setenv ethaddr xx:xx:xx:xx:xx:xx

    setenv netmask xx.xx.xx.xx

    setenv gatewayip xx.xx.xx.xx

    ping serverip,确保网络畅通。

 

3、烧写映像文件到SPI Flash

    以16M SPI Flash为例。(实际需要根据具体情况而定)

    1)地址空间说明

        |      1M       |      4M       |      11M      |

        |---------------|---------------|---------------|

        |     boot      |     kernel    |     rootfs    |

 

        以下的操作均基于图示的地址空间分配,您也可以根据实际情况进行调整。

    2)烧写u-boot

        sf probe 0

        mw.b 0x82000000 ff 100000

        tftp 0x82000000 u-boot-hi3520D.bin

        sf probe 0

        sf erase 0x0 0x100000

        sf write 0x82000000 0x0 0x100000        

        reset   

    3)烧写内核

        mw.b 0x82000000 ff 0x400000

        tftp 82000000 uImage_3520d

        sf probe 0

        sf erase 100000 400000

        sf write 82000000 100000 400000

    4)烧写文件系统

        mw.b 82000000 ff b00000

        tftp 0x82000000 rootfs_3520d_64k.jffs2

        sf erase 500000 b00000

        sf write 82000000 500000 b00000

    5)设置启动参数

        setenv bootargs 'mem=64M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=jffs2 mtdparts=hi_sfc:1M(boot),4M(kernel),11M(rootfs)'

        setenv bootcmd 'sf probe 0;sf read 0x82000000 0x100000 0x400000;bootm 0x82000000'

        sa

   

4、启动新系统

    reset        # 重启进入新系统。

Spi(cs1) ID: 0x68 0x40 0x17 0x68 0x40 0x17

SPI FLASH start_up_mode is 3 Bytes

Spi(cs1):

Block:64KB

Chip:8MB

Name:"BH25Q64BS"

spi size: 8MB

chip num: 1

5 cmdlinepart partitions found on MTD device hi_sfc

Creating 5 MTD partitions on "hi_sfc":

0x000000000000-0x000000040000 : "uboot"

0x000000040000-0x000000190000 : "kernel"

0x000000190000-0x000000210000 : "config"

0x000000210000-0x000000690000 : "rootfs"

0x000000690000-0x000000800000 : "app"

Fixed MDIO Bus: probed

himii: probed

 1)生成最终烧录的u-boot

进入/osdrv/tools/pc_tools/uboot_tools/目录下,配置相关的excel表格,根据自己的硬件情况配置。

完成配置表格的修改后,保存表格。单击表格第一个标签页上的按钮“Generage reg bin file”,生成临时文件 reg_info.bin。

 

注意:

这里详细操作需要参考海思官方指定手册

《Hi3521/Hi3520A/Hi3520D/Hi3515A/Hi3515C U-boot 移植应用开发指南.pdf》

这里我直接使用这个海思默认的配置文件:

mkboot-hi3520d.sh reg_info_Hi3520D-bvt_No1_660_330_660_ddr_innerFEPHY.bin reg_info_Hi3515A-bvt_No1_600_300_600_ddr_innerFEPHY.bin u-boot-hi3520d.bin

注意:这里我们的板子使用的是内部的PHY芯片,因此,在选择 bin 文件的使用,我选择的是 innerFEPHY.bin 这个 bin。

 

    2)烧写u-boot

sf probe 0

mw.b 0x82000000 ff 0x100000

tftp 0x82000000 u-boot-hi3520d.bin

sf probe 0

sf erase 0x0 0x100000

sf write 0x82000000 0x0 0x100000

reset

 

    3)烧写内核

        mw.b 82000000 ff 200000 //2M

        tftp 82000000 uImage_3520d

        sf probe 0

        sf erase 100000 200000 //擦除2M

        sf write 82000000 100000 200000 //写入2M内容

 

    4)烧写文件系统

        mw.b 82000000 ff 400000 //4M

        tftp 0x82000000 rootfs_3520d_64k.jffs2

        sf erase 300000 400000 //擦除4M

        sf write 82000000 300000 400000 //写入4M

 

U-Boot 2010.06 (Sep 19 2019 - 15:55:33)

 

Check spi flash controller v350... Found

Spi(cs1) ID: 0x68 0x40 0x17 0x68 0x40 0x17

Spi(cs1): find unrecognized spi flash.

Can't find a valid spi flash chip.

Spi(cs1) ID: 0x68 0x40 0x17 0x68 0x40 0x17

Spi(cs1): find unrecognized spi flash.

Can't find a valid spi flash chip.

Check spi flash controller v350... Found

Spi(cs1) ID: 0x68 0x40 0x17 0x68 0x40 0x17

Spi(cs1): find unrecognized spi flash.

Can't find a valid spi flash chip.

Spi(cs1) ID: 0x68 0x40 0x17 0x68 0x40 0x17

Spi(cs1): find unrecognized spi flash.

Can't find a valid spi flash chip.

*** Warning - bad CRC, using default environment

 

In:    serial

Out:   serial

Err:   serial

这里可以看到,启动信息中显示不能检测到flash芯片。

 

setenv bootargs 'mem=64M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=jffs2 mtdparts=hi_sfc:1M(boot),2M(kernel),4M(rootfs)'

setenv bootcmd 'sf probe 0;sf read 0x82000000 0x100000 0x400000;bootm 0x82000000'

sa

将其中的参数配置成和我们的规划的一样就可以了。u-boot 1M kernel 2M rootfs 3M。

registered taskstats version 1

Node at 0x0000f884 with length 0x00000a71 would run over the end of the erase block

Perhaps the file system was created with the wrong erase size?

jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x0000f888: 0x0a71 instead

jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x0000f88c: 0x7658 instead

jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x0000f890: 0x0019 instead

jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x0000f894: 0x0019 instead

.......................

jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00290020: 0x03ab instead

jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00290024: 0xac17 instead

Further such events for this erase block will not be printed

VFS: Mounted root (jffs2 filesystem) on device 31:2.

Freeing init memory: 104K

Kernel panic - not syncing: Attempted to kill init!

Backtrace:

[<c0026548>] (dump_backtrace+0x0/0x110) from [<c02efcac>] (dump_stack+0x18/0x1c)

 r6:c381c120 r5:c03cb530 r4:c03cb530 r3:60000113

[<c02efc94>] (dump_stack+0x0/0x1c) from [<c02efd24>] (panic+0x74/0x188)

[<c02efcb0>] (panic+0x0/0x188) from [<c00367a4>] (do_exit+0x62c/0x6d4)

 r3:c381c120 r2:c381fdf0 r1:c381c000 r0:c0367470

 r7:c381c000

[<c0036178>] (do_exit+0x0/0x6d4) from [<c0036890>] (do_group_exit+0x44/0xb4)

 r7:c3820000

[<c003684c>] (do_group_exit+0x0/0xb4) from [<c0042690>] (get_signal_to_deliver+0x1b4/0x378)

 r4:00106001 r3:c381fe08

[<c00424dc>] (get_signal_to_deliver+0x0/0x378) from [<c00254e0>] (do_signal+0x78/0x578)

[<c0025468>] (do_signal+0x0/0x578) from [<c0025a44>] (do_notify_resume+0x64/0x70)

[<c00259e0>] (do_notify_resume+0x0/0x70) from [<c00231f8>] (work_pending+0x24/0x28)

 r4:ffffffff r3:00000000

spi flash使用jffs2格式的镜像,制作jffs2镜像时,需要用到spi flash的块大小。这些信息会在uboot启动时会打印出来。建议使用时先直接运行mkfs.jffs2工具,根据打印信息填写相关参数。下面以块大小为64KB为例:

osdrv/pub/bin/pc/mkfs.jffs2 -d osdrv/pub/rootfs_uclibc -l -e 0x40000 -o osdrv/pub/rootfs_uclibc_256k.jffs2

或者

osdrv/pub/bin/pc/mkfs.jffs2 -d osdrv/pub/rootfs_glibc -l -e 0x40000 -o osdrv/pub/rootfs_glibc_256k.jffs2

mkfs.jffs2: error!: Usage: mkfs.jffs2 [OPTIONS]

Make a JFFS2 file system image from an existing directory tree

 

Options:

  -p, --pad[=SIZE]        Pad output to SIZE bytes with 0xFF. If SIZE is

                          not specified, the output is padded to the end of

                          the final erase block

  -r, -d, --root=DIR      Build file system from directory DIR (default: cwd)

  -s, --pagesize=SIZE     Use page size (max data node size) SIZE.

                          Set according to target system's memory management

                          page size (default: 4KiB)

  -e, --eraseblock=SIZE   Use erase block size SIZE (default: 64KiB)

  -c, --cleanmarker=SIZE  Size of cleanmarker (default 12)

  -m, --compr-mode=MODE   Select compression mode (default: priority)

  -x, --disable-compressor=COMPRESSOR_NAME

                          Disable a compressor

  -X, --enable-compressor=COMPRESSOR_NAME

                          Enable a compressor

  -y, --compressor-priority=PRIORITY:COMPRESSOR_NAME

                          Set the priority of a compressor

  -L, --list-compressors  Show the list of the available compressors

  -t, --test-compression  Call decompress and compare with the original (for test)

  -n, --no-cleanmarkers   Don't add a cleanmarker to every eraseblock

  -o, --output=FILE       Output to FILE (default: stdout)

  -l, --little-endian     Create a little-endian filesystem

  -b, --big-endian        Create a big-endian filesystem

  -D, --devtable=FILE     Use the named FILE as a device table file

  -f, --faketime          Change all file times to '0' for regression testing

  -q, --squash            Squash permissions and owners making all files be owned by root

  -U, --squash-uids       Squash owners making all files be owned by root

  -P, --squash-perms      Squash permissions on all files

      --with-xattr        stuff all xattr entries into image

      --with-selinux      stuff only SELinux Labels into jffs2 image

      --with-posix-acl    stuff only POSIX ACL entries into jffs2 image

  -h, --help              Display this help text

  -v, --verbose           Verbose operation

  -V, --version           Display version information

  -i, --incremental=FILE  Parse FILE and generate appendage output for it

其中几个重要的说一下:

-d:跟你要制作的rootfs文件所使用的源文件

-p:决定制作的rootfs的大小,如果不足,将填充0xff

-s:决定制作的rootfs的页大小,默认的4Kb。

-e:擦除的页大小,默认是64Kb

-l:小端模式

-o:将要输出的rootfs文件

./bin/pc/mkfs.jffs2 -d ./rootfs_uclibc -l  --pad=400000 -o ./rootfs_uclibc_256k.jffs2

Freeing init memory: 104K

 

            _ _ _ _ _ _ _ _ _ _ _ _

            \  _  _   _  _ _ ___

            / /__/ \ |_/

           / __   /  -  _ ___

          / /  / /  / /

  _ _ _ _/ /  /  \_/  \_ ______

___________\___\__________________

 

[RCS]: /etc/init.d/S00devs

[RCS]: /etc/init.d/S01udev

/etc/init.d/S01udev: line 6: udevd: not found

/etc/init.d/S01udev: line 7: udevstart: not found

[RCS]: /etc/init.d/S80network

udev:

主要负责Linux下的设备文件生成的,当我们在系统上插入一个新的设备的时候,udev就会根据相关的规则自动在系统的/dev/文件夹下面生成相应的设备文件。这样系统就可以实现外部设备的即插即用功能了。

udev-100/rootfs/etc/udev 文件复制到我们 /osdrv/pub/rootfs_uclibc 中的 etc下面

udev-100/udev-100/udevd  复制到  /osdrv/pub/rootfs_uclibc/sbin

udev-100/udev-100/udevstart 复制到 /osdrv/pub/rootfs_uclibc/sbin

问题1:

udevd[364]: main: error opening /dev/null: No such file or directory

解决:

在rootfs_uclibc/etc/init.d 中,打开 S00devs,增加以下内容:

mknod /dev/null c 1 3

问题2:

udevd (365): /proc/365/oom_adj is deprecated, please use /proc/365/oom_score_adj instead.

解决:

 

 

    ifconfig eth0 hw ether 00:AA:BB:CC:DD:EE //修改MAC地址

    ifconfig eth0 192.168.1.200 netmask 255.255.255.0  //IP地址和网关

    route add default gw 192.168.1.1 //路由表配置

ping 192.168.1.253 网络测试OK

mount -o nolock 192.168.1.253:/home/ubuntu/Work/Hi/3520/Hi3520D_SDK_V2.0.5.1 /mnt

mount OK

    cd mpp/ko

    ./load3520D -i

ls: cannot access '/hiwork/osdrvhi3520D.C02': No such file or directory

arm-hisiv200-linux-gcc -Wall -g -I/home/ubuntu/Work/Hi/3520/Hi3520D_SDK_V2.0.5.1/mpp/include  -I/home/ubuntu/Work/Hi/3520/Hi3520D_SDK_V2.0.5.1/mpp/sample/hifb/../common  -I/home/ubuntu/Work/Hi/3520/Hi3520D_SDK_V2.0.5.1/mpp/extdrv/tw2865  -I/home/ubuntu/Work/Hi/3520/Hi3520D_SDK_V2.0.5.1/mpp/extdrv/tw2960  -I/home/ubuntu/Work/Hi/3520/Hi3520D_SDK_V2.0.5.1/mpp/extdrv/tlv320aic31  -I/home/ubuntu/Work/Hi/3520/Hi3520D_SDK_V2.0.5.1/mpp/extdrv/cx26828 -I/home/ubuntu/Work/Hi/3520/Hi3520D_SDK_V2.0.5.1/mpp/extdrv/nvp6114 -Dhi3520D -DHICHIP=0x3520D100 -DHI_DEBUG -DHI_XXXX -DDEMO -lpthread -lm -Wl,-gc-sections   -c -o sample_hifb.o sample_hifb.c

make[1]: arm-hisiv200-linux-gcc: Command not found

<builtin>: recipe for target 'sample_hifb.o' failed

make[1]: *** [sample_hifb.o] Error 127

make[1]: Leaving directory '/home/ubuntu/Work/Hi/3520/Hi3520D_SDK_V2.0.5.1/mpp/sample/hifb'

Makefile:3: recipe for target 'rel' failed

make: *** [rel] Error 2

mpp默认使用的交叉编译工具是arm-hisiv200-linux-gcc,这里我们需要重新安装交叉编译工具。步骤略过。

# ./sample_audio

-sh: ./sample_audio: not found

在网上查找导致的这个的原有以下几个:

1)没有安装sh工具。

2)执行文件的权限不够。

3)执行程序需要使用到动态链接库,但是板子上没有。

1)安装sh工具:重新编译busybox,添加sh命令,烧录测试依旧有问题。

2)修改可执行程序的文件权限,未解决。

3)将本地的库拷贝到板子上测试,未解决。

编译完成后发现,kernel和uboot的大小已经超过了flash的最大值,因此不行。

我发现,海思提供标准SDK其实是有两个版本的,一个是V1.0版本的,另一个是V2.0版本的。而V1.0的是使用的arm-hisiv100-linux编译的库,而V2.0使用的是arm-hisiv200-linux编译的库。因此,这里我直接使用SDK_V1.0里面的mpp/lib库文件。

 

应用程序开发:(参考编码端和解码端的开发记录

 

 

 

 

 

 

 

 

 

  • IT6801 驱动移植:
    1. 首先拷贝mpp,新建一个mpp_git的库将mpp相关的程序拷贝到这个库中,在mpp中的sample中添加一个it6801的工程,我们将3531中有关it6801的操作copy到这里。
    2. 然后我们开始在it6801里面进行测试i2c的操作,主要就是将i2c.c这个函数中有关i2c的读写操作部分替换成3520D中的i2c部分。
    3. 这里我们需要先测试一下I2C的,确定其能否正常读取到IT6801。
      1. 在3520的外部设备驱动说明中,我们没有看到有操作I2C的说明,但是我们在板子中的/dev目录中可以看到有gpioi2c这个设备。
      2. 通过直接操作读写这个设备发现I2C没有任何反应。
      3. 经过查找,在mpp_git/mpp/extdrv/gpio_i2c这个路径下面发现有操作I2C相关的代码,经过测试发现进行读写的时候我们的I2C接口是有反应的。
    4. 直接使用这里的 i2c_read.c 和 i2c_write.c ,将这两个函数中有关i2c读写的操作porting到it6801中的i2c.c中。
    5. porting完成测试OK。
  • 使用新的版本库后程序可以运行了,接下来开始移植相关应用程序。
  • 寻找使用arm-hisiv100-linux编译过的库文件(/mpp/lib):
  • 修改编译工具链,重新编译kernel和uboot:
  • 经过以下测试:
  • 工具安装完毕,编译OK。
  • 在板子上运行,这里报错:
  • MMP程序测试:
    1. PC端编译问题:
  • ko加载发现HDMI相关的ko无法正常运行,这里是使用官方的,后期我们会替换成我们自己的HDMI芯片。
  • KO加载测试:
    1.  在单板linux系统下,进入mpp/ko目录,加载KO
  • 网络测试完成。
  • 测试网络并mount到我们系统上进行测试:
  • 网络配置:
    1. 现在终端命令已经可以使用了,接下来开始对网络环境进行配置,这里参考官方配置说明:
  • 完成后重新制作rootfs文件系统,烧录后测试OK。
  • 其他rootfs有关的问题:
  • 经过查找,udev-100 文件在 SDK中的osdrv/tools/board_tools 这个文件夹下,现在将我们系统需要的文件复制到我们的rootfs中。
  • 其中以下几个文件需要进行复制:
  • 根据提示,可知系统找不到udev和udevstart这两个文件,经过查询,这两个文件的信息如下:
  • 解决启动后终端无法操作问题:
    1. 然后将其烧录进去后成功启动了,但是进去系统后,终端不能进行任何操作,我怀疑是busybox有问题,打印如下:
  • 按照说明我制作了jffs2格式的文件,但是烧录进去之后还是不行。
  • 后来我将擦除的块使用默认大小了:
  • 其中的 mkfs.jffs2 的参数说明如下:
  • 这个是我烧录的默认的rootfs文件:rootfs_hi3520d_64k.squashfs 导致的,后来我尝试了 rootfs_hi3520d_256k.squashfs 这个也不行。
  • 因为我们的u-boot中传给kernel的参数的rootfs的类型是 jffs2 类型的文件系统。于是我制作 jffs2 文件系统。
  • 在/osdrv/pub 下面有 rootfs_uclibc.tgz 压缩包,将这个压缩文件解压后就是rootfs的文件了。
  • 这里我们根据 readme 的操作说明制作:
  • rootfs启动调试:
    1. rootfs打印错误如下:
  • 保存环境变量后重启系统,内核成功启动。但是在到了rootfs的时候却打印了一堆其他东西。
  • Kernel启动问题:
    1. u-boot启动后就没有打印信息,于是我又开始了kernel的烧录,烧录后发现不能启动,没有任何反应。
    2. 经过查看文档,发现,还需要添加u-boot的环境变量,以便u-boot将这些环境变量传参给我们的kernel。
    3. 环境变量如下:
  • u-boot启动失败调试:
    1. 根据官方的u-boot移植手册说明,将板子上的Flash型号的大小信息填入u-boot的配置表格中,然后生成了一个reg_info.bin文件,在根据手册表述,将reg_info.bin 文件放到我们的osdrv/tools/pc_tools/uboot_tools下面,使用mkboot.sh工具生成一个u-boot_hi3520d.bin文件。
    2. 经过我在板子上烧录后,u-boot连打印都没有了。
    3. 为了测试我添加的flash型号后生成的文件是否改变,于是我又重新在表格中添加了一个型号,然后生成文件,之后再次删除,然后生成文件。比较两次的生成的文件后发现文件一模一样。于是基本确定,直接添加flash是不行的。
    4. 之后又重试了几次都不行,后来发现可能需要修改u-boot的源码,里面的有关底层驱动的文件/u-boot-2010.06/drivers/mtd/spi/hisfc350,这里面有和flash相关的文件,如果新加的flash可以在这里面对其进行定义。
    5. 其中 hisfc350_spi_ids.c 这文件是记录flash id和一些基本信息的,其他文件都是相关的flash的一些具体读写操作的实现细节。
    6. 在这里面,我将板子上的flash的ID号添加到其中一个被屏蔽掉的flash,重新编译u-boot后重新烧录,发现还是不行。
    7. 后来我使用了我们自己的flash芯片,然后将我们从板子上的flash中读出来的bin文件烧录进去,发现板子可以正常启动。说明我们的flash应该是存在与u-boot的表中的。
    8. 于是我烧录了原厂的u-boot,发现u-boot可以正常启动了。
    9. 至此,u-boot启动失败问题解决。
  • u-boot烧录启动失败:
    1. 根据上面的提示进行烧录操作,但是烧录完成时发现启动的uboot是有问题的,打印如下:
  • 这里需要将操作说明中的空间配置更改如下:
  • 但是这里我们的板子的flash是8M的,根据板子启动信息可知:
  • 烧录镜像文件:
    1. 根据操作说明如下:
  • busybox制作问题解决:
  • 编译结果如下:
  • rootfs制作问题解决:
    1. 报错如下:
  • 编译整个osdrv目录:
    1. 根据osd/readme_cn.txt 的相应操作,报错:
  • 单独编译uboot测试:(一次成功)
  • 单独编译kernel尝试:
  • 再次编译报错:
  • 测试交叉编译工具编译:
    1. 根据SDK安装说明,尝试编译osdrv下面的所有文件,开始编译提示:
  • 根据手册安装交叉编译工具:
  • 根据SDK安装说明,我们可以安装交叉编译工具,但是,这里目前有两个版本的交叉编译工具链,uclibc和glibc,这里简要说明下这两个工具的区别:
  • 根据SDK安装说明安装时执行:
展开阅读全文
©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值