软件开发指导
编译手册
编译环境要求
编译主机需在ubuntu系统中进行,笔者主机系统为Ubuntu 20.04,推荐使用与笔者相同版本的Ubuntu,避免因为版本不同导致一些工具出现兼容问题。
主机需可连接外网,因为编译系统过程需要下载某些文件。
部分文件的代码语法与python3有冲突,推荐使用python2。
下载源码包
下载Tina5.0源码包。
创建编译目录:
mkdir -p ~/my-work/Tina5.0/
把源码放到刚创建的目录中,并进行解压:
tar xvf 133-tina5.0-20240926-v1.1.tar.gz -C ~/my-work/Tina5.0/
Linux 系统镜像编译及生成
编译环境配置
进入Tina5.0目录,执行如下命令,清除旧的编译和配置生成文件,初始化环境变量:
cd Tina5.0
./build.sh distclean
cd Tina5.0
source build/envsetup.sh
开发板型号选择
执行如下命令选择开发板型号:
lunch
配置信息
执行如下命令配置开发板的相关信息:
./build.sh config
编译 LinuxSDK
执行如下命令,对 LinuxSDK 进行整体编译:
./build.sh
打包镜像
执行如下命令,打包生成 Linux 系统镜像:
./build.sh pack
局部编译
在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
编译过程中可能遇见的问题
执行./build.sh时遇见路径错误
执行以下指令
cd ./rtos/lichee/rtos
make distclean
若在执行make distclean时,遇见语法问题:
执行以下指令,检查当前使用的 python 版本,若当前使用的为 python3,则需修改为 python2
python --version
显示无法找到文件drv_type.h文件:
执行以下指令:
vim ./kernel/linux-5.4/drivers/net/wireless/realtek/rtl8723du/Makefile
找到如下代码:
修改代码如下图所示,或修改为当前 PC 机的绝对路径:
开发指导
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
CAN 简介
CAN(Controller Area Network)总线,即控制器局域网总线,是一种有效支持分布式控制或实时控制的串行通信网络。CAN总线是一种在汽车上广泛采用的总线协议,被设计作为汽车环境中的微控制器通讯。 如果想了解更多的内容可以参考CAN应用报告
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、 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
UART 简介
ART(Universal Asynchronous Receiver/Transmitter)是一种通用异步串行通信接口
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
GPIO 简介
GPIO,全称 General-Purpose Input/Output(通用输入输出),是一种软件运行期间能够动态配置和控制的通用引脚。 所有的 GPIO 在上电后的初始状态都是输入模式,可以通过软件设为上拉或下拉,也可以设置为中断脚,驱动强度都是可编程的,其核心是填充 GPIO bank 的方法和参数,并调用 gpiochip_add 注册到内核中。
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
中断
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 //低电平触发
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