Skip to main content

x1600linux系统rtos提前显示logo

SPL(core0) 加载引导 RTOS(core0), RTOS(core0)同时进行加载kernel镜像和显示logo 任务, 二者均完成后返回SPL(core0), SPL(core0) 引导 kernel(core0)。

一 硬件环境

halley6:x1600e, nand,uart2_pb, 30000000 8n1.

二 软件配置

linux: x1600e_halley6_nand_defconfig

rtos: x1600e_nand_defconfig

三实现流程

根据实际情况使用IConfigTool工具配置屏幕, linux和rtos的屏幕相关配置必须保持一致 (lcd设备、背光设备、fb驱动)

3.1 linux设置

3.1.1 设置SPL_RTOS_LOAD_KERNEL

# 确定当前uboot编译路径及配置文件
xy@vb:~/job/linux/x1600/build$ cat configs/x1600e_halley6_nand_defconfig|grep uboot
APP_uboot_toolchain_dir=../tools/toolchains/mips-gcc520-glibc222
APP_uboot_dir=../bootloader/uboot-x2000
APP_uboot_config=x1600e_base_halley6_xImage_sfc_nand

可知当前uboot编译配置文件和路径。 下一步打开uboot配置文件进行修改,增加宏定义:CONFIG_SPL_RTOS_LOAD_KERNEL:

xy@vb:~/job/linux/x1600/build$ cd ../bootloader/uboot-x2000/
xy@vb:~/job/linux/x1600/bootloader/uboot-x2000$ vim include/configs/x1600_base.h
#ifndef __X1600_BASE_H__
#define __X1600_BASE_H__

#define CONFIG_ROOTFS_SQUASHFS
#define CONFIG_ROOTFS2_SQUASHFS
#define CONFIG_SPL_SERIAL_SUPPORT

/*rtos display logo*/
#define CONFIG_SPL_RTOS_LOAD_KERNEL

#include "x1600_base_common.h"

#endif /* __X1600_BASE_H__ */

3.1.2 设置lcd无需再初始化

1

3.1.3 设置电源管理

若使用了 gpios regulator, 需要在IConfigTool内勾选 [ 开机时使能, 防止kernel开机时自动关闭 (如快起时,提前亮屏的场景) ]

如下lcd供电使用到了 gpios regulator

2

3

3.2 rtos设置

rtos和linux的屏幕相关配置必须保持一致(lcd设备、背光设备、fb驱动)。

3.2.1 设置SFC驱动

4

3.2.2 设置CMYK_TO_RGB

5

3.2.3 设置libjpeg

6

3.2.4 设置panel

7

3.2.5 设置背光

8

3.2.6 设置fb

9

3.2.7 设置RTOS固件加载地址

rtos系统和linux系统是两个独立的系统。为避免rtos和Linux内存操作空间冲突导致系统运行出错, 可将其分开.分开的方式有两种。

君正linux平台内存划分框架示意图如下(以x1600e 128MB内存为例):

9_1

从后往前依次是:RTOS固件(rtos显示logo时系统加载的内存空间)---》linux的RMEM(camera、lcd等专用内存空间) ---》系统可申请内存空间MEM。

如果RTOS_SIZE或者RMEM参数没有在spl的boards.cfg中指定的话,说明系统没有预留对应的内存空间。此时内存划分图上只需取消这部分预留段即可,每个内存段大小根据实际需求设置,但是顺序是一定不能变化的

3.2.7.1 内存划分方法一:没有设置RTOS_SIZE

boards.cfg对应参数中没有设置RTOS_SIZE时,说明没有特意预留rtos运行内存空间。此时rtos只能使用MEM最后的对应长度空间,以最大限度的避免linux系统和rtos运行内存交叉而引起rtos异常。注意,此方法因为没有做代码上的内存分段保护,还是有linux系统占用到rtos 指定内存空间的风险,从而造成rtos系统不可控的风险。所以不推荐使用。

例如:rtos系统运行需要16M内存,boards.cfg中指定RMEM_MB=16(也就是预留RMEM段16MB),当前总内存为128MB,那么代码配置上可以指定rtos的运行内存空间为MEM的最后16M,也就是96M~112M。内存划分示意如下:

10

对于本例中,x1600e对应内存大小为64M,并且boards.cfg x1600e_base_halley6_xImage_sfc_nand中没有指定RMEM_MB和RTOS_SIZE参数,那么64MB空间都是MEM,RTOS固件就是在MEM段的最后,rtos中固件大小设置了16M,所以CONFIG_OS_MEM_ADDR需配置为0x83000000(48MB)。

11

3.2.7.2 内存划分方法二:设置RTOS_SIZE

可以通过boards.cfg中设置RTOS_SIZE_MB来划分内存。对应内存划分顺序示意如下:

12

如果boards.cfg x1600e_base_halley6_xImage_sfc_nand中有指定rtos系统运行的内存大小参数:RTOS_SIZE_MB,那么rtos加载的内存位置在整个内存的最后面。从后往前依次是:RTOS固件(rtos显示logo时系统加载的内存空间)---》linux的RMEM(camera、lcd等专用内存空间) ---》系统可申请内存空间MEM。

推荐使用这种方式。但是本例没有使用这种内存划分方式。

3.2.8 添加快速显示logo的代码

在/rtos工程目录/freertos/vendor/vendor.c内, 修改代码如下:

#include <stdio.h>
#include "example/driver/quick_boot_logo_and_boot_kernel_example.c"

void vendor_init(void *arg)
{
printf("vendor init...\n");
quick_boot_logo_and_load_kernel(arg);
}

rtos加载完logo进入kernel例子,源码位于/rtos工程目录/freertos/example/driver/quick_boot_logo_and_boot_kernel_example.c

logo图片位于/rtos工程目录/freertos/example/resource/test.jpeg, 可替换,格式仅限jpeg。

/******************************boot_logo******************************/
#include <cmyk_to_rgb.h>
#include "jpeglib.h"
#include "jerror.h"

#include <driver/fb.h>
#include <driver/backlight.h>
#include <driver/irq.h>

#include <include_bin.h>
INCBIN(jpeg_display, "example/resource/test.jpeg"); //示例中存放开机logo图片位置,可替换为自己开机logo图片,格式为jpeg

static struct fb_info info;
static struct fb_handle *fb0_handle;

四 编译

上述linux设置后保存,编译如下:

xy@vb:~/job/linux/test/build$ make x1600e_halley6_nand_defconfig
xy@vb:~/job/linux/test/build$ make

上述rtos设置后保存,编译如下:

xy@vb:~/job/freertos/freertos$ make x1600e_nand_defconfig
xy@vb:~/job/freertos/freertos$ make

五 烧录

分区表配置如下, 在烧录工具分区内分配一块rtos分区:

13

rtos分区烧录/rtos工程目录/freertos/zero.bin文件, 烧录成功后板子上电显示logo后启动Linux。

14