ISVP平台编译
一.U-Boot配置及编译
1.1 U-Boot配置
1.1.1 U-Boot命令说明
• reset:重新启动嵌入式系统。
• printenv:打印当前系统环境变量。
• setenv:设置环境变量,格式:setenv name value,表示将 name 变量设置成 value 值。
• saveenv:保存环境变量到 flash 中。
• sleep:延迟执行,格式:sleep N,可以延迟 N 秒钟执行。
• run:执行环境变量中指定的命令,格式:run var,支持通过空格分隔的方式一次传入多个环境变量名。
• cp:在内存中复制数据块,格式:cp source target count,第一个参数是源地址,第二个参数是目的地址,第三个参数是复制数目。
• tftpboot:通过 tftp 协议下载文件到内存,格式:tftpboot target source。
• fatls:显示 SD 卡的文件,格式:fatls mmc 0。
• bootm:可以引导启动存储在内存中的程序映像,格式:bootm addr1 addr2,第一个参数是程序映像的地址,第二个参数一般是 ramdisk 地址。
详细介绍可以在 U-Boot 命令行输入 help 查看。
1.1.2 U-Boot环境变量
当开发板上电启动后,会进入 U-Boot 命令行界面。在读秒时按下 Enter 键,即可进入 U-Boot 命令行界面。通过执行命令 printenv,可以查看 U-Boot 的环境变量:
PRJ# printenv bootargs=console=ttyS1,115200n8 64M@0x0 rmem=64M@0x4000000 init=/linuxrc rootfstype=squashfs root=/dev/mtdblock2 rw mtdparts=jz_sfc:256k(boot),2560k(kernel),2048k(root),-(appfs) bootcmd=sf0 probe;sf0 read 0x80600000 0x40000 0x280000; bootm 0x80600000 bootdelay=1 ipaddr=193.169.4.151 serverip=193.169.4.2
参数介绍:
• bootargs:内核通过 bootargs 找到文件系统。
• console=ttyS1,115200n8:设置串口号为 ttyS1,波特率为 115200。
• mem=64M@0x0 rmem=64M@0x4000000:分配内存。
• init=/linuxrc:系统首先运行 /linuxrc 文件。
• rootfstype=squashfs:使用压缩只读文件系统 squashfs。
• root=/dev/mtdblock2 rw:内核根文件从 mtdblock2 挂载。
• mtdparts=sfc0_nor:256k(boot),2560k(kernel),2048k(root),-(appfs):MTD 分区情况。
• bootcmd:启动命令。
• sf0 probe;sf0 read 0x80600000 0x40000 0x280000; bootm 0x80600000:启动内核。
• ipaddr=193.169.4.151:开发板 IP 地址。
• serverip=193.169.4.2:tftp 服务器 IP 地址。
1.1.3 更改mtd分区大小
在U-Boot中,可以通过命令行参数将MTD分区大小传递给内核。相关的配置信息位于include/configs/PRJ.h中,对于8M Flash的情况,您可以查找 CONFIG_SFC_NOR的平台定义,定义如下:
mtdparts=sfc0_nor:256k(boot),2560k(kernel),2048k(root),-(appfs)
MTD分区配置如下,针对Flash大小的不同,分区情况有所不同。总共有四块分区,其中U-Boot、Kernel和rootfs的大小是固定的,而appfs分区具有自适应功能,会根据Flash的总大小进行动态分配。
在8M Flash的情况下:
• U-Boot分区大小为256k;
• kernel分区大小为2.5M;
• rootfs(squashfs)分区大小为2M;
• appfs分区将自动分配剩余空间,即3.25M。
在16M Flash的情况下:
• U-Boot分区大小仍为256K;
• kernel分区大小仍为2.5M;
• rootfs(squashfs)分区大小仍为2M;
• appfs分区将自动分配剩余空间,即11.25M。
注意:通常不建议修改U-Boot、Kernel和rootfs的大小,因为它们的大小与系统的启动和运行紧密相关。但如果您确实需要调整appfs分区的大小,可以在MTD分区配置中进行相应的修改。
1.1.4 更改rmem内存大小
在include/configs/PRJ.h文件中,可以修改rmem大小,参考平台定义如下:
#define BOOTARGS_MEM_512 " mem=32M@0x0 rmem=32M@0x2000000" #define BOOTARGS_MEM_1G " mem=64M@0x0 rmem=64M@0x4000000" #define BOOTARGS_MEM_2G " mem=128M@0x0 rmem=128M@0x8000000"
以64M配置例说明:
• mem=32M@0x0 rmem=32M@0x2000000:对mem大小的相关设置。
• mem=32M@0x0:从0地址开始给系统(mem)分配32M内存。
• rmem=32M@0x2000000:从0x2000000(32M)地址开始给SDK(rmem)分配32M。
在T32/T33/T32Pro等芯片中,嵌入了一块64M、128M或256M的内存,若需要调整rmem大小,请务必确保在总内存大小不变的情况下,按照以下格式进行修改:
以64M内存为基准,如果要减小rmem大小4M,则需要增加mem大小4M。因此,如果要将mem大小设为36M,从0地址开始,rmem应为28M,地址应从36M开始。
#define BOOTARGS_MEM_512 " mem=36M@0x0 rmem=28M@0x2400000"
1.1.5 U-Boot配置文件中常见修改点
1. CONFIG_BOOTARGS
主要修改点是内核启动以后的内存配置,分区大小配置。
注意:mem表示内核启动以后保留内存,rmem表示预留给SDK的内存(包括ISP模块的内存),两者相加为芯片真实内存大小,具体大小可参考代码。
2. CONFIG_BOOTCOMMAND
配置U-Boot加载启动内核的命令。例如:
norflash启动模式下使用SD卡启动的命令
sf probe;sf read 0x80600000 0x40000 0x280000; bootm 0x80600000
改为
mmc read 0x80600000 0x1800 0x3000; bootm 0x80600000
3. CONFIG_BOOTDELAY
配置U-Boot的等待时间。
4. U-Boot中添加密码功能
修改配置文件,修改PRJ.h中添加如下内容:
#define CONFIG_AUTOBOOT_KEYED //必配。 #define CONFIG_AUTOBOOT_STOP_STR “123456” //必配,U-Boot设置的密码。 #define CONFIG_AUTOBOOT_PROMPT “Press xxx in %d second” // bootdelay,选配,U-Boot提示信息。 #define CONFIG_AUTOBOOT_DELAY_STR “linux” //选配。
U-Boot提示信息代码的具体实现在common/main.c中abortboot_keyed(int bootdelay);可以根据自己的需要具体改动。
5. SD卡升级问题
在PRJ.h中添加#define CONFIG_AUTO_UPDATE 定义。具体代码实现在common/cmd_sdupdate.c中。
注意:
• 在cmd_sdupdate.c代码中LOAD_ADDR表示把SD卡上的相应内存加载到内存的位置。程序中默认设置为0x82000000,由于这个地址位于U-Boot的堆上,常见U-Boot的堆大小的设置在PRJ.h中CONFIG_SYS_MALLOC_LEN宏的配置;所以这个地址能够被使用的大小将受到堆大小的限制,还有U-Boot代码中malloc空间的限制。
• 需要读取较大文件的时候,可以适当增大CONFIG_SYS_MALLOC_LEN。
6. 编译出的U-Boot大于限制的大小处理方法
在U-Boot代码中,默认将SPL大小限制为26KBytes,U-Boot大小限制为214KBytes,总共限制为240KBytes大小。如果编译生成的u-boot-with-spl.bin文件大小超过240KBytes,则U-Boot将无法启动。
解决方案一:
在确认是SPL大小还是U-Boot第二阶段大小超过限制后,可以根据实际情况选择修改PRJ.h中U-Boot大小(CONFIG_SYS_MONITOR_LEN宏)或者SPL大小(CONFIG_SPL_MAX_SIZE宏)的定义。同时,需要修改CONFIG_BOOTARGS变量中boot分区的大小及以后分区的偏移地址。
解决方案二:
如果生成的u-boot-with-spl.bin超出240KBytes,较少可以采取压缩U-Boot的方式。在PRJ.h中修改#undef CONFIG_SPL_LZOP为#define CONFIG_SPL_LZOP,然后重新编译烧录的文件名为u-boot-lzo-with-spl.bin。
7. U-Boot网络问题
默认的Tassadar配置包含了以太网部分的代码。如果产品在U-Boot阶段不需要TFTP下载或者NFS挂载功能,可以裁掉以太网部分代码,以减小U-Boot的大小。
打开PRJ.h配置文件,把#define CONFIG_CMD_NET宏注释掉即可。
1.2 U-Boot编译
U-Boot可以单独编译,不需要依赖其他代码。T32/T33/T32Pro的U-Boot板级配置文件位于include/configs/PRJ.h。
步骤一:$ make distclean 清除旧配置,每次编译前必须执行此操作。
步骤二:$ make PRJ00x_x_xxx 根据芯片类型编译U-Boot,生成对应的u-boot-with-spl.bin。
T32/T33/T32Pro芯片编译nor flash启动的U-Boot
型号 | 编译命令 | 说明 |
T32LQ | make PRJ007_lq_sfcnor | 编译nor flash启动的U-Boot,针对T32LQ芯片 |
T32NQ | make PRJ007_nq_sfcnor | 编译nor flash启动的U-Boot,针对T32NQ芯片 |
T32XQ | make PRJ007_xq_sfcnor | 编译nor flash启动的U-Boot,针对T32XQ芯片 |
T32ZL | make PRJ007_zl_sfcnor | 编译nor flash启动的U-Boot,针对T32ZL芯片 |
T32ZN | make PRJ007_zn_sfcnor | 编译nor flash启动的U-Boot,针对T32ZN芯片 |
T32ZX | make PRJ007_zx_sfcnor | 编译nor flash启动的U-Boot,针对T32ZX芯片 |
T32VN | make PRJ007_vn_sfcnor | 编译nor flash启动的U-Boot,针对T32VN芯片 |
T32VNP | make PRJ007_vnp_sfcnor | 编译nor flash启动的U-Boot,针对T32VNP芯片 |
T32VL | make PRJ007_vl_sfcnor | 编译nor flash启动的U-Boot,针对T32VL芯片 |
T32VX | make PRJ007_vx_sfcnor | 编译nor flash启动的U-Boot,针对T32VX芯片 |
T33 系列 | ||
T33L | make PRJ008_l_sfcnor | 编译nor flash启动的U-Boot,针对T33L芯片 |
T33DL | make PRJ008_dl_sfcnor | 编译nor flash启动的U-Boot,针对T33DL芯片 |
T33N | make PRJ008_n_sfcnor | 编译nor flash启动的U-Boot,针对T33N芯片 |
T33ZL | make PRJ008_zl_sfcnor | 编译nor flash启动的U-Boot,针对T33ZL芯片 |
T33ZN | make PRJ008_zn_sfcnor | 编译nor flash启动的U-Boot,针对T33ZN芯片 |
T33VN | make PRJ008_vn_sfcnor | 编译nor flash启动的U-Boot,针对T33VN芯片 |
T33VL | make PRJ008_vl_sfcnor | 编译nor flash启动的U-Boot,针对T33VL芯片 |
T32Pro 系列 | ||
T32ProZL | make PRJ009_zl_sfcnor | 编译nor flash启动的U-Boot,针对T32ProZL芯片 |
T32ProZN | make PRJ009_zn_sfcnor | 编译nor flash启动的U-Boot,针对T32ProZN芯片 |
T32ProZX | make PRJ009_zx_sfcnor | 编译nor flash启动的U-Boot,针对T32ProZX芯片 |
T32ProVL | make PRJ009_vl_sfcnor | 编译nor flash启动的U-Boot,针对T32ProVL芯片 |
T32ProVN | make PRJ009_vn_sfcnor | 编译nor flash启动的U-Boot,针对T32ProVN芯片 |
T32ProVNP | make PRJ009_vnp_sfcnor | 编译nor flash启动的U-Boot,针对T32ProVNP芯片 |
T32ProVX | make PRJ009_vx_sfcnor | 编译nor flash启动的U-Boot,针对T32ProVX芯片 |
T32/T33/T32Pro芯片编译NAND flash启动的U-Boot
型号 | 编译命令 | 说明 |
T32LQ | make PRJ007_lq_sfcnand | 编译NAND flash启动的U-Boot,针对T32LQ芯片(sfc0接口) |
T32NQ | make PRJ007_nq_sfcnand | 编译NAND flash启动的U-Boot,针对T32NQ芯片(sfc0接口) |
T32XQ | make PRJ007_xq_sfcnand | 编译NAND flash启动的U-Boot,针对T32XQ芯片(sfc0接口) |
T32ZL | make PRJ007_zl_sfcnand | 编译NAND flash启动的U-Boot,针对T32ZL芯片(sfc0接口) |
T32ZN | make PRJ007_zn_sfcnand | 编译NAND flash启动的U-Boot,针对T32ZN芯片(sfc0接口) |
T32ZX | make PRJ007_zx_sfcnand | 编译NAND flash启动的U-Boot,针对T32ZX芯片(sfc0接口) |
T32VN | make PRJ007_vn_sfcnand | 编译NAND flash启动的U-Boot,针对T32VN芯片(sfc0接口) |
T32VNP | Make PRJ007_vnp_sfcnand | 编译NAND flash启动的U-Boot,针对T32VNP芯片(sfc0接口) |
T32VL | make PRJ007_vl_sfcnand | 编译NAND flash启动的U-Boot,针对T32VL芯片(sfc0接口) |
T32VX | make PRJ007_vx_sfcnand | 编译NAND flash启动的U-Boot,针对T32VX芯片(sfc0接口) |
| T33 系列 | ||
T33L | make PRJ008_l_sfcnand | 编译NAND flash启动的U-Boot,针对T33L芯片(sfc0接口) |
T33DL | make PRJ008_dl_sfcnand | 编译NAND flash启动的U-Boot,针对T33DL芯片(sfc0接口) |
T33N | make PRJ008_n_sfcnand | 编译NAND flash启动的U-Boot,针对T33N芯片(sfc0接口) |
T33ZL | make PRJ008_zl_sfcnand | 编译NAND flash启动的U-Boot,针对T33ZL芯片(sfc0接口) |
T33ZN | make PRJ008_zn_sfcnand | 编译NAND flash启动的U-Boot,针对T33ZN芯片(sfc0接口) |
T33VN | make PRJ008_vn_sfcnand | 编译NAND flash启动的U-Boot,针对T33VN芯片(sfc0接口) |
T33VL | make PRJ008_vl_sfcnand | 编译NAND flash启动的U-Boot,针对T33VL芯片(sfc0接口) |
T32Pro 系列 | ||
T32ProZL | make PRJ009_zl_sfcnand | 编译NAND flash启动的U-Boot,针对T32ProZL芯片(sfc0接口) |
T32ProZN | make PRJ009_zn_sfcnand | 编译NAND flash启动的U-Boot,针对T32ProZN芯片(sfc0接口) |
T32ProZX | make PRJ009_zx_sfcnand | 编译NAND flash启动的U-Boot,针对T32ProZX芯片(sfc0接口) |
T32ProVL | make PRJ009_vl_sfcnand | 编译NAND flash启动的U-Boot,针对T32ProVL芯片(sfc0接口) |
T32ProVN | make PRJ009_vn_sfcnand | 编译NAND flash启动的U-Boot,针对T32ProVN芯片(sfc0接口) |
T32ProVX | make PRJ009_vx_sfcnand | 编译NAND flash启动的U-Boot,针对T32ProVX芯片(sfc0接口) |
T32ProVNP | make PRJ009_vnp_sfcnand | 编译NAND flash启动的U-Boot,针对T32ProVNP芯片(sfc0接口) |
T32/T33/T32Pro芯片编译常规功能SD卡启动的U-Boot
型号 | 编译命令 | 说明 |
T32LQ | make PRJ007_lq_msc0 | 编译常规功能SD卡启动的U-Boot,针对T32LQ芯片(msc0接口) |
T32NQ | make PRJ007_nq_msc0 | 编译常规功能SD卡启动的U-Boot,针对T32NQ芯片(msc0接口) |
T32XQ | make PRJ007_xq_msc0 | 编译常规功能SD卡启动的U-Boot,针对T32XQ芯片(msc0接口) |
T32ZL | make PRJ007_zl_msc0 | 编译常规功能SD卡启动的U-Boot,针对T32ZL芯片(msc0接口) |
T32ZN | make PRJ007_zn_msc0 | 编译常规功能SD卡启动的U-Boot,针对T32ZN芯片(msc0接口) |
T32ZX | make PRJ007_zx_msc0 | 编译常规功能SD卡启动的U-Boot,针对T32ZX芯片(msc0接口) |
T32VN | make PRJ007_vn_msc0 | 编译常规功能SD卡启动的U-Boot,针对T32VN芯片(msc0接口) |
T32VNP | make PRJ007_vnp_msc0 | 编译常规功能SD卡启动的U-Boot,针对T32VNP芯片(msc0接口) |
T32VL | make PRJ007_vl_msc0 | 编译常规功能SD卡启动的U-Boot,针对T32VL芯片(msc0接口) |
T32LQ | make PRJ007_lq_msc1 | 编译常规功能SD卡启动的U-Boot,针对T32LQ芯片(msc1接口) |
T32NQ | make PRJ007_nq_msc1 | 编译常规功能SD卡启动的U-Boot,针对T32NQ芯片(msc1接口) |
T32XQ | make PRJ007_xq_msc1 | 编译常规功能SD卡启动的U-Boot,针对T32XQ芯片(msc1接口) |
T32ZL | make PRJ007_zl_msc1 | 编译常规功能SD卡启动的U-Boot,针对T32ZL芯片(msc1接口) |
T32ZN | make PRJ007_zn_msc1 | 编译常规功能SD卡启动的U-Boot,针对T32ZN芯片(msc1接口) |
T32ZX | make PRJ007_zx_msc1 | 编译常规功能SD卡启动的U-Boot,针对T32ZX芯片(msc1接口) |
T32VN | make PRJ007_vn_msc1 | 编译常规功能SD卡启动的U-Boot,针对T32VN芯片(msc1接口) |
T32VNP | make PRJ007_vnp_msc1 | 编译常规功能SD卡启动的U-Boot,针对T32VNP芯片(msc1接口) |
T32VL | make PRJ007_vl_msc1 | 编译常规功能SD卡启动的U-Boot,针对T32VL芯片(msc1接口) |
T32VX | make PRJ007_vx_msc1 | 编译常规功能SD卡启动的U-Boot,针对T32VX芯片(msc1接口) |
T33 系列 | ||
T33L | make PRJ008_l_msc0 | 编译常规功能SD卡启动的U-Boot,针对T33L芯片(msc0接口) |
T33DL | make PRJ008_dl_msc0 | 编译常规功能SD卡启动的U-Boot,针对T33DL芯片(msc0接口) |
T33N | make PRJ008_n_msc0 | 编译常规功能SD卡启动的U-Boot,针对T33N芯片(msc0接口) |
T33ZL | make PRJ008_zl_msc0 | 编译常规功能SD卡启动的U-Boot,针对T33ZL芯片(msc0接口) |
T33ZN | make PRJ008_zn_msc0 | 编译常规功能SD卡启动的U-Boot,针对T33ZN芯片(msc0接口) |
T33VN | make PRJ008_vn_msc0 | 编译常规功能SD卡启动的U-Boot,针对T33VN芯片(msc0接口) |
T33VL | make PRJ008_vl_msc0 | 编译常规功能SD卡启动的U-Boot,针对T33VL芯片(msc0接口) |
T33L | make PRJ008_l_msc1 | 编译常规功能SD卡启动的U-Boot,针对T33L芯片(msc1接口) |
T33DL | make PRJ008_dl_msc1 | 编译常规功能SD卡启动的U-Boot,针对T33DL芯片(msc1接口) |
T33N | make PRJ008_n_msc1 | 编译常规功能SD卡启动的U-Boot,针对T33N芯片(msc1接口) |
T33ZL | make PRJ008_zl_msc1 | 编译常规功能SD卡启动的U-Boot,针对T33ZL芯片(msc1接口) |
T33ZN | make PRJ008_zn_msc1 | 编译常规功能SD卡启动的U-Boot,针对T33ZN芯片(msc1接口) |
T33VN | make PRJ008_vn_msc1 | 编译常规功能SD卡启动的U-Boot,针对T33VN芯片(msc1接口) |
T33VL | make PRJ008_vl_msc1 | 编译常规功能SD卡启动的U-Boot,针对T33VL芯片(msc1接口) |
T32Pro 系列 | ||
T32ProZL | make PRJ009_zl_msc0 | 编译常规功能SD卡启动的U-Boot,针对T32ProZL芯片(msc0接口) |
T32ProZN | make PRJ009_zn_msc0 | 编译常规功能SD卡启动的U-Boot,针对T32ProZN芯片(msc0接口) |
T32ProZX | make PRJ009_zx_msc0 | 编译常规功能SD卡启动的U-Boot,针对T32ProZX芯片(msc0接口) |
T32ProVL | make PRJ009_vl_msc0 | 编译常规功能SD卡启动的U-Boot,针对T32ProVL芯片(msc0接口) |
T32ProVN | make PRJ009_vn_msc0 | 编译常规功能SD卡启动的U-Boot,针对T32ProVN芯片(msc0接口) |
T32ProVNP | make PRJ009_vnp_msc0 | 编译常规功能SD卡启动的U-Boot,针对T32ProVNP芯片(msc0接口) |
T32ProVX | make PRJ009_vx_msc0 | 编译常规功能SD卡启动的U-Boot,针对T32ProVX芯片(msc0接口) |
T32ProZL | make PRJ009_zl_msc1 | 编译常规功能SD卡启动的U-Boot,针对T32ProZL芯片(msc1接口) |
T32ProZN | make PRJ009_zn_msc1 | 编译常规功能SD卡启动的U-Boot,针对T32ProZN芯片(msc1接口) |
T32ProZX | make PRJ009_zx_msc1 | 编译常规功能SD卡启动的U-Boot,针对T32ProZX芯片(msc1接口) |
T32ProVL | make PRJ009_vl_msc1 | 编译常规功能SD卡启动的U-Boot,针对T32ProVL芯片(msc1接口) |
T32ProVN | make PRJ009_vn_msc1 | 编译常规功能SD卡启动的U-Boot,针对T32ProVN芯片(msc1接口) |
T32ProVNP | make PRJ009_vnp_msc1 | 编译常规功能SD卡启动的U-Boot,针对T32ProVNP芯片(msc1接口) |
T32ProVX | make PRJ009_vx_msc1 | 编译常规功能SD卡启动的U-Boot,针对T32ProVX芯片(msc1接口) |
二.Kernel编译
2.1 编译流程
T32/T33/T32Pro支持三个版本的内核:kernel-3.10.14版本、 kernel-4.4.94 版本和kernel-5.15.170 版本。这三个版本的内核配置功能是相同的。
内核可以单独编译,不需要依赖其他代码。以goat板级编译为例,进入Kernel源码目录,在 arch/mips/configs/ 文件夹下找到内核的板级配置文件。对于(T32:PRJ007,T33:PRJ008,T32Pro:PRJ009)芯片板级,根据demo板名称分为:
• Vela 全功能开发板:PRJ00x_vela_defconfig。(T32Pro: PRJ009_vela_defconfig)
• Goat 38板: PRJ00x_goat_defconfig。(T32Pro: PRJ009_goat_defconfig)
注:Vela板级主要用于常电多摄(需注意Switch引脚跟SFC引脚的冲突),Goat板级主要用于常电单摄。
下列操作以 goat 板为介绍:
步骤一:$make PRJ00x_goat_defconfig #使用配置好的板级文件
步骤二:$ make menuconfig #根据需求选择性编译(若无增加或删除配置,可跳过)
步骤三:$ make uImage #编译内核文件
如果报错,执行**$ make distclean**,然后从第一步重新开始。
注意:对于内核之外的驱动程序编译,需要依赖内核,并且内核必须先编译完成。当内核发生更改后,可能会导致驱动模块无法安装的情况,或者虽然可以安装但会出现未知错误。这是因为内核重新编译后,函数符号表发生变化,需要重新编译驱动程序来正确链接内核函数。
内核默认配置文件中的配置通常会留有一定余量,但实际产品往往需要对内核进行裁减,以释放更多的内存和文件存储空间。
2.2 Kernel裁剪选项及说明
1. CONFIG_NETWORK_FILESYSTEMS 网络文件系统通常用于开发,因为会占用较多内存和存储空间,如果不需要NFS可以禁用,并可以使用tftp进行替代。
2. CONFIG_KALLSYMS &CONFIG_KALLSYMS_ALL 内核函数符号表,会占用较多空间,在panic时的函数栈可以显示出函数名。当内核稳定后,可以考虑Disable此功能,但建议完全稳定之前使能此功能。
3. 其他文件系统 一般文件系统会占用较多空间,开发者可根据需求对文件系统的选项进行裁减,比如ext文件系统等。
4. 和产品定义无关的模块 比如USB,以太网,TF卡等。
注意:深度裁减内核是一项技术难度较高的任务,因此建议开发者在充分了解配置情况后再进行深度裁减操作。
三.Driver编译
3.1 驱动说明
常用驱动介绍
驱动名称 | 驱动介绍 |
T32: tx-isp-PRJ007.ko; T33: tx-isp-PRJ008.ko; T32Pro: tx-isp-PRJ009.ko | ISP驱动 |
T32: sensor_xxxx_PRJ007.ko; T33: sensor_xxxx_PRJ008.ko T32Pro: sensor_xxxx_PRJ009.ko | sensor驱动 |
sinfo.ko | Sensor探测驱动 |
audio.ko | 音频驱动 |
mpsys.ko | 多进程获取YUV数据 |
tnpu.ko | 算法驱动 |
3.2 驱动编译注意事项
1. 在编译驱动之前,请确保先编译好内核。
2. 完成内核编译后,建议首先编译isp驱动。在进行编译之前,请在isp驱动的Makefile文件中指定好内核路径。
3. 完成isp驱动编译后,再进行sensor驱动的编译。编译sensor驱动前,请在sensor驱动的Makefile文件中指定好内核路径和isp驱动路径。
4. 对于其他驱动的编译,只需在其驱动的Makefile文件中指定好内核路径即可。
四.应用程序编译
4.1 应用程序编译
应用程序编译注意有以下几点:
1. Tassadar提供了一套交叉编译工具链,默认支持glibc和uclibc的交叉编译工具。因此基于glibc或者uclibc的程序均可使用这套交叉编译工具链进行编译。 工具链名称为:mips-gcc540-glibc222-r3.3.7.mxu2.cve2.tar.bz2-glibc程序编译方法:默认link的libc即为glibc。 -uclibc程序编译方法:C_FLAGS+=-muclibc CXX_FLAGS+=-muclibc,LD_FLAGS+=-muclibc 或者使用 mips-linux-uclibc-gnu-gcc。
2. 关于API库的链接顺序:[IVS库] [mxu库] [libimp/libsysutils] [libalog]
3. 由于libimp中依赖C++库,因此需要使用mips-linux-gnu-g++进行链接,若使用gcc链接,需要手动添加LD_FLAGS+=stdc++。
4. 如何优化elf文件的大小:
1. 编译等级选择O2:C_FLAGS/CXX_FLAGS += -O2。
2. DFLAG += -Wl,-gc-sections,不链接不必要的段。
3. elf文件执行mips-linux-gnu-strip,链接后删除不必要的段。
5. 如果系统中存在多个elf文件需要链接库文件,建议使用动态链接的方式。而如果只有一个文件需要链接库文件,建议使用静态链接的方式(注意系统中只能存在一份libimp相关功能的实例)。在调试阶段选择动态链接方式可以更方便地进行调试和问题反馈。
4.2 运行应用程序
要在目标机上运行已编译好的应用程序,需要按照如下步骤进行操作:
1. 将应用程序以及可能需要的库文件等添加到目标机的根文件系统相应的目录中。一般来说,将应用程序放置在/bin目录下,库文件放置在/lib目录下,配置文件放置在/etc目录下。
2. 制作包含新应用程序的根文件系统。
注意:如果执行的应用程序需要对文件系统进行操作,可以选择squashfs或jffs2 文件系统。如果应用程序需要在系统启动后自动运行,可以在制作文件系统时编辑 /etc/init.d/rcS 文件,并添加需要启动的应用程序路径或shell脚本路径。
五.Tassadar-SDK编译
5.1 SDK sample编译
进入Tassadar-SDK:
Tassadar-T32_T33_T32Pro-x.x.x-202xxxxx/software/board/Ingenic-SDK/media/zh/samples/libimp-samples路径中。
在当前路径下,存在一个名为Makefile的文件。执行 make 命令即可编译当前路径下所有的示例文件。编译成功后,生成的所有可执行文件将会出现在当前路径下。之后,您可以选择将所需的可执行文件复制到开发板上,以便直接在该开发板上使用。
在进行编译之前,需要先指定当前使用的sensor型号。打开sample-common.h文件,修改成对应sensor信息,然后再进行示例文件的编译。
5.2 SDK sample介绍
示例程序位于/samples/libimp-samples目录下,这些示例程序是依赖于SDK库的应用程序,包括音频、视频等应用程序。用户可以参考提供的示例程序,编写自己相应的工程代码。
完成编译后,拷贝可执行程序到开发板上测试即可。详细介绍请参考下表:
SDK示例程序说明表
应用文件 | 功能 | 执行命令 | 执行结果 |
sample-Ai.c | 获取模拟mic录音数据 | ./sample-Ai | 会在/tmp下生成对应音频PCM数据 |
sample-Ai-AEC.c | 模拟mic配合喇叭获取回音消除数据 | ./sample-Ai-AEC | 生成录音文件test_for_play.pcm和回音消除之后的文件test_aec_record.pcm |
sample-Ai-Ref.c | 模拟mic配合喇叭获取音频参考帧数据 | ./sample-Ai-Ref | 生成录音文件ref_test_record.pcm ref_test_for_play.pcm和参考帧文件ref_test_ref.pcm |
sample-Ao.c | 通过喇叭播放指定音频数据 | ./sample-Ao | 会通过spk播放出指定的音频数据 |
sample-Audio.c | 音频编解码测试 | ./sample-Audio | 会在/tmp下生成录制后的数据,回音消除数据,编码和解码数据 |
sample-dmic.c | 获取数字mic录音数据(支持1 2 4 chn) | ./sample-dmic | 会在/tmp下生成对应音频PCM数据 |
sample-dmic-aec.c | 数字mic配合喇叭获取回音消除数据 | ./sample-dmic-aec | 会在/tmp下生成对应音频PCM数据 |
sample-dmic-ref.c | 数字mic配合喇叭获取音频参考帧数据 | ./sample-dmic-ref | 通过播放play.pcm,生成dmic录音文件和dmic_ref.pcm参考帧文件 |
sample-Framesource.c | 获取非直通通道YUV数据功能 | ./sample-Framesource | 会在/tmp下生成对应格式的图片 |
sample-Framesource-Inject-yuv.c | 实现非ISP输入数据的方式,后面通过绑定OSD、编码,实现OSD叠加和编码 | ./sample-Framesource-Inject-yuv | 在/tmp目录下生成H264/H265码流文件 |
sample-I2d.c | 实现非直通通道YUV数据0°、90°、180°、270°、360°旋转及编码 | ./sample-I2d | 在/tmp目录下生成H264/H265码流文件 |
sample-MutiPro-GetFrame.c | 获取非直通通道多进程获取YUV数据功能 | ./sample-MutiPro-GetFrame | 在/tmp目录下生成YUV数据 |
sample-SnapFrame.c | 获取非直通通道YUV数据功能 | ./sample-SnapFrame | 在/tmp目录下生成YUV数据 |
sample-Encoder-jpeg.c | 实现ISP出图和JPEG编码出流的基础功能 | ./sample-Encoder-jpeg | 在/tmp目录下生成JPEG码流文件 |
sample-Encoder-video.c | 实现ISP出图和H264/H265编码出流,以及JPEG抓图的基础功能 | ./sample-Encoder-video | 在/tmp目录下生成H264/H265/JPEG码流文件 |
sample-Encoder-video-Roi.c | 实现动态配置编码ROI功能 | ./sample-Encoder-video-Roi | 在/tmp目录下生成H264/ H265码流文件 |
sample-Encoder-changeRcMode.c | 实现动态切换码控模式的功能 | ./sample-Encoder-changeRcMode | 在/tmp目录下生成H264/H265/JPEG码流文件 |
sample-Encoder-changeRes.c | 实现编码通道0切换分辨率的功能 | ./sample-Encoder-changeRes | 在/tmp目录下生成不同分辨率的码流文件 |
sample-Encoder-MutiProcess.c | 实现多进程编码的功能 | ./sample-Encoder-MutiProcess | 在/tmp目录下生成H264/H265/JPEG码流文件 |
sample-Encoder-Input-yuv.c | 实现外部输入NV12图片 | ./sample-Encoder-Input-yuv | 在/tmp目录下生成H264/H265/JPEG码流文件 |
sample-IspOsd.c | 演示了如何使用ISP绘制OSD | ./sample-IspOsd | 在/tmp下产生带OSD的视频 |
sample-OSD-2BIT.c | 使用2bit模式进行OSD绘制 | ./sample-OSD-2BIT | 在/tmp下产生带OSD的视频 |
sample-OSD.c | 演示了主码流使用ISP绘制OSD,次码流使用IPU绘制OSD的实现方式 | ./sample-OSD | 在/tmp下产生带OSD的视频 |
sample-KernEnc.c | 演示内核编码取流操作 | ./sample-KernEnc | 会在/tmp下产生内核编码的视频 |
sample-KernEnc-video.c | 演示内核编码取流后,应用编码取流操作 | ./sample-KernEnc-video | 会在/tmp下产生内核编码的视频和应用编码的视频 |
sample-Snap-Kernel-raw.c | 实现获取kernel启动阶段的raw图功能 | ./sample-Snap-Kernel-raw | 会在/tmp下产生内核编码的RAW数据 |
sample-Snap-Kernel-yuv.c | 实现获取kernel启动阶段的yuv图功能 | ./sample-Snap-Kernel-yuv | 会在/tmp下产生外部输入nv12编码的视频 |
sample-Atlas-Encoder-video.c | 对视频流AOV功能的演示 | ./sample-Atlas-Encoder-video | 覆盖多路码流测试,包括如何开启AOV功能,AOV模式如何切换到长出流模式,长出流切换到AOV模式 |
sample-Atlas-Ai.c | 对音频流AOV功能的演示 | ./sample-Atlas-Ai | 拾音的AOV功能 |
sample-IVS-unbind-base-move.c | 移动检测 | ./sample-IVS-unbind-base-move | 会在串口打印8*8小格对应的移动情况 |
sample-IVS-unbind-move.c | 移动检测 | ./sample-IVS-unbind-move | 会在串口打印8*8小格对应的移动情况 |
sample-AutoIR.c | 实现根据AWB RGB之间变化趋势和AE稳定性做IRCUT切换 | ./sample-AutoIR | 在/tmp目录下生成H264/H265码流文件 |
sample-ISP-flip.c | 实现ISP镜像翻转示例 | ./sample-ISP-flip | 在/tmp目录下生成H264/H265码流文件 |
sample-ISP-InternalChn.c | 实现ISP 模块bypass的示例 | ./sample-ISP-InternalChn | 在/tmp目录下生成H264/H265数据 |
sample-ISP-SetFPS.c | 实现ISP 帧率设置的示例 | ./sample-ISP-SetFPS | 在/tmp目录下生成H264/H265数据 |
sample-AutoZoom.c | 实现自动变焦示例 | ./sample-AutoZoom | 在/tmp目录下生成H2644/H265码流文件 |
sample-LCD.c | 播放一段视频在SLCD上 | ./sample-LCD | SLCD显示播放的视频 |
sample-adc.c | adc采集电压,并打印在串口 | ./sample-adc | 实时打印电压值在串口 |
sample-wdt.c | 打开看门狗并喂狗 | ./sample-wdt | 打印喂狗的时间在串口 |
sample-keyevent.c | 按键时间的触发和响应 | ./sample-keyevent | 响应按键事件 |
sample-Temperature.c | 打印芯片温度 | ./sample-Temperature | 打印实时芯片温度 |
sample-chipid.c | 获取芯片唯一ID的功能 | ./sample-chipid | 在串口打印芯片的唯一ID值 |