软件开发指导

编译手册

编译环境要求

  1. 编译主机需在ubuntu系统中进行,笔者主机系统为Ubuntu 20.04,推荐使用与笔者相同版本的Ubuntu,避免因为版本不同导致一些工具出现兼容问题。

  2. 主机需可连接外网,因为编译系统过程需要下载某些文件。

  3. 部分文件的代码语法与python3有冲突,推荐使用python2。

下载源码包

  1. 下载Tina5.0源码包。

  2. 创建编译目录:

mkdir -p ~/my-work/Tina5.0/
  1. 把源码放到刚创建的目录中,并进行解压:

tar xvf 133-tina5.0-20240926-v1.1.tar.gz -C ~/my-work/Tina5.0/

Linux 系统镜像编译及生成

  1. 编译环境配置

进入Tina5.0目录,执行如下命令,清除旧的编译和配置生成文件,初始化环境变量:
cd Tina5.0
./build.sh distclean

cd Tina5.0
source build/envsetup.sh
  1. 开发板型号选择

执行如下命令选择开发板型号:
lunch
编译手册1.jpg
  1. 配置信息

执行如下命令配置开发板的相关信息:
./build.sh config
编译手册2.jpg
  1. 编译 LinuxSDK

执行如下命令,对 LinuxSDK 进行整体编译:
./build.sh
  1. 打包镜像

执行如下命令,打包生成 Linux 系统镜像:
./build.sh pack
  1. 局部编译

在Tina5.0目录下执行如下命令,单独编译kernel:
./build.sh kernel
打包生成 boot.fex 文件,路径为:/out/t113_i/evb1_auto/pack_out
./build.sh pack
将 boot.fex 添加进系统文件下,执行如下命令:
dd if=boot.fex of=/dev/mmcblk1p4

reboot
在Tina5.0目录下执行如下命令,单独编译bootloader:
./build.sh buildroot_rootfs

编译过程中可能遇见的问题

  1. 执行./build.sh时遇见路径错误

编译手册3.jpg
执行以下指令
cd ./rtos/lichee/rtos

make distclean
若在执行make distclean时,遇见语法问题:
编译手册4.jpg
执行以下指令,检查当前使用的 python 版本,若当前使用的为 python3,则需修改为 python2
python --version
  1. 显示无法找到文件drv_type.h文件:

编译手册5.jpg
执行以下指令:
vim ./kernel/linux-5.4/drivers/net/wireless/realtek/rtl8723du/Makefile
找到如下代码:
编译手册6.jpg
修改代码如下图所示,或修改为当前 PC 机的绝对路径:
编译手册7.jpg

开发指导

U-Boot板级文件

  • u-boot设备树文件:/brandy/brandy-2.0/u-boot-2018/arch/arm/dts/sun8iw20p1-soc-system.dts

    /device/config/chips/t113_i/configs/evb1_auto/uboot-board.dts

  • u-boot板级配置文件:/brandy/brandy-2.0/u-boot-2018/include/configs/sun8iw20p1.h

  • u-boot极级编译配置文件:/brandy/brandy-2.0/u-boot-2018/configs/sun8iw20p1_auto_t113_i_defconfig

Linux 内核板级文件

  • 内核板级编译配置文件:device/config/chips/t113_i/configs/evb1_auto/linux-5.4/board.dts

  • 内核板级设备树文件:device/config/chips/t113_i/configs/evb1_auto/linux-5.4/config-5.4

CAN

  1. CAN 简介

CAN(Controller Area Network)总线,即控制器局域网总线,是一种有效支持分布式控制或实时控制的串行通信网络。CAN总线是一种在汽车上广泛采用的总线协议,被设计作为汽车环境中的微控制器通讯。 如果想了解更多的内容可以参考CAN应用报告
  1. DTS 节点配置

内核设备树 device/config/chips/t113_i/configs/evb1_auto/linux-5.4/board.dts
can0: can@0x0 {
                #address-cells = <1>;
                #size-cells = <0>;
                compatible = "allwinner,sun8i-awlink";
                device_type = "awlink0";
                id = <0>;
                /*
                status = "disabled";
                */
                status = "okay";
        };
can1: can@0x1 {
                #address-cells = <1>;
                #size-cells = <0>;
                compatible = "allwinner,sun8i-awlink";
                device_type = "awlink1";
                id = <1>;
                /*
                status = "disabled";/
                */
                status = "okay";
        };
  1. 更多指令

1、 ip link set awlinkX down                 //关闭can设备;
2、 ip link set awlinkX up                   //开启can设备;
3、 ip -details link show awlinkX                 //显示can设备详细信息;
4、 candump awlinkX                          //接收can总线发来数据;
5、 ifconfig awlinkX down                         //关闭can设备,以便配置;6、 ip link set canX up type can bitrate 250000 //设置can波特率
7、 conconfig awlinkX bitrate + 波特率;
8、 canconfig awlinkX start                 //启动can设备;
9、 canconfig awlinkX ctrlmode loopback on //回环测试;
10、canconfig awlinkX restart                 // 重启can设备;
11、canconfig awlinkX stop                 //停止can设备;
12、canecho awlinkX                         //查看can设备总线状态;
13、cansend awlinkX --identifier=ID+数据         //发送数据;
14、candump awlinkX --filter=ID:mask        //使用滤波器接收ID匹配的数据

UART

  1. UART 简介

ART(Universal Asynchronous Receiver/Transmitter)是一种通用异步串行通信接口
  1. DTS 节点配置

内核设备树 device/config/chips/t113_i/configs/evb1_auto/linux-5.4/board.dts
&uart0 {
    pinctrl-names = "default", "sleep";
    pinctrl-0 = <&uart0_pins_a>;
    pinctrl-1 = <&uart0_pins_b>;
        status = "okay";
};

&uart1 {
        pinctrl-names = "default", "sleep";
        pinctrl-0 = <&uart1_pins_a>;
        pinctrl-1 = <&uart1_pins_b>;
        status = "okay";
};

&uart2 {
        pinctrl-names = "default", "sleep";
        pinctrl-0 = <&uart2_pins_a>;
        pinctrl-1 = <&uart2_pins_b>;
        /*
        status = "disabled";
        */
        status = "okay";
};

&uart3 {
        pinctrl-names = "default", "sleep";
        pinctrl-0 = <&uart3_pins_a>;
        pinctrl-1 = <&uart3_pins_b>;
    /*
    status = "disabled";
    */
    status = "okay";
};


&uart4 {
        pinctrl-names = "default", "sleep";
        pinctrl-0 = <&uart4_pins_a>;
        pinctrl-1 = <&uart4_pins_b>;
        status = "okay";
};

&uart5 {
        pinctrl-names = "default", "sleep";
        pinctrl-0 = <&uart5_pins_a>;
        pinctrl-1 = <&uart5_pins_b>;
        status = "okay";
};

GPIO

  1. GPIO 简介

GPIO,全称 General-Purpose Input/Output(通用输入输出),是一种软件运行期间能够动态配置和控制的通用引脚。 所有的 GPIO 在上电后的初始状态都是输入模式,可以通过软件设为上拉或下拉,也可以设置为中断脚,驱动强度都是可编程的,其核心是填充 GPIO bank 的方法和参数,并调用 gpiochip_add 注册到内核中。
  1. GPIO引脚编号计算

GPIO pin脚计算公式:pin = bank * 32 + number
引脚命名分别为:PB x、PC x、PD x、PE x、PF x、PG x。
下面演示PC0引脚计算方法:
因为没有被命名为PA的引脚,所以PC0引脚的bank等于2,
Pin = 2 * 32 + 0 = 64
  1. 中断

IRQ_TYPE_LEVEL_LOW 表示中断由低电平触发,当该引脚接收到低电平信号时可以触发中断函数。 这里还可以配置成如下:
IRQ_TYPE_NONE //默认值,无定义中断触发类型
IRQ_TYPE_EDGE_RISING //上升沿触发
IRQ_TYPE_EDGE_FALLING //下降沿触发
IRQ_TYPE_EDGE_BOTH //上升沿和下降沿都触发
IRQ_TYPE_LEVEL_HIGH //高电平触发
IRQ_TYPE_LEVEL_LOW //低电平触发
  1. GPIO 调试接口

Debugfs 文件系统目的是为开发人员提供更多内核数据,方便调试。 这里 GPIO 的调试也可以用 Debugfs 文件系统,获得更多的内核信息。GPIO 在 Debugfs 文件系统中的接口为 /sys/kernel/debug/gpio,可以这样读取该接口的信息:
## 手动挂载 debugfs
mount -t debugfs none /sys/kernel/debug

cat sys/kernel/debug/gpio
gpiochip0: GPIOs 0-223, parent: platform/2000000.pinctrl, 2000000.pinctrl:
 gpio-44  (                    |usb0-vbus           ) out lo
 gpio-64  (                    |heartbeat           ) out lo
 gpio-65  (                    |disk                ) out lo
 gpio-108 (                    |bt_hostwake         ) in  hi
 gpio-109 (                    |bt_wake             ) out lo
 gpio-130 (                    |otg_id              ) in  hi IRQ
 gpio-166 (                    |cd                  ) in  hi ACTIVE LOW
 gpio-203 (                    |user-led0           ) out lo

HDMI

硬件上有一个HDMI显示输出接口,通过LT8912B芯片实现MIPI转HDMI显示输出。
内核驱动文件:kernel/linux-5.4/drivers/video/fbdev/sunxi/disp2/disp/lcd/lt8912b.c
u-boot驱动文件:brandy/brandy-2.0/u-boot-2018/drivers/video/sunxi/disp2/disp/lcd/lt8912b.c