全志Tina Linux 修改串口(UART0->UART1)


说明:本人使用的是F133-A(D1s)

1.修改boot0和uboot的串口

1.1.修改sys_config.fex文件。

1)文件路径为:tina-d1-h/device/config/chips/d1s/configs/nezha/sys_config.fex

修改前:

[uart_para]
uart_debug_port = 0
uart_debug_tx   = port:PF2<3><1><default><default>
uart_debug_rx   = port:PF4<3><1><default><default>

修改后:

[uart_para]
uart_debug_port = 1
uart_debug_tx   = port:PG06<2><1><default><default>
uart_debug_rx   = port:PG07<2><1><default><default>

其中<3>改为<2> 需要查阅数据手册(D1s_Datasheet_V1.0)中 PG6、PG7 的UART1是 Function2 得知的
在这里插入图片描述

1.2.修改UBOOT CONSOLE INDEX

1)路径为:tina-d1-h/lichee/brandy-2.0/u-boot-2018/configs/sun20iw1p1_defconfig

2)在最后添加

CONFIG_SPECIFY_CONSOLE_INDEX=y
CONFIG_CONS_INDEX=2	   #说明:这里是UART 1+1 = 2  串口号+1 (注意,这个注释记得去掉,否则编译报错)

2.修改kernel的串口

2.1.修改设备树(kernel使用的串口输出)

1)文件路径为:tina-d1-h/device/config/chips/d1s/configs/nezha/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 = "disabled";
};

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

&uart3 {
	compatible = "allwinner,sun20iw1-dsp-uart";
	pinctrl-names = "default", "sleep";
	pinctrl-0 = <&uart3_pins_a>;
	pinctrl-1 = <&uart3_pins_a>;
	status = "disabled";
};

修改后:

&uart0 {
	pinctrl-names = "default", "sleep";
	pinctrl-0 = <&uart0_pins_a>;
	pinctrl-1 = <&uart0_pins_b>;
	status = "disabled";	//修改的地方:关闭
};

&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";
};

&uart3 {
	compatible = "allwinner,sun20iw1-dsp-uart";
	pinctrl-names = "default", "sleep";
	pinctrl-0 = <&uart3_pins_a>;
	pinctrl-1 = <&uart3_pins_a>;
	status = "disabled";
};

2.2.修改启动bootargs

1)路径为:tina-d1-h/device/config/chips/d1s/configs/default/env.cfg

修改前:

#kernel command arguments
earlyprintk=sunxi-uart,0x02500000
initcall_debug=0
console=ttyS0,115200

修改后:

#kernel command arguments
earlyprintk=sunxi-uart,0x02500400
initcall_debug=0
console=ttyS1,115200

说明:earlyprintk=sunxi-uart,0x02500000 需要修改为 UART1 的地址,查阅手册可知为 0x02500400

在这里插入图片描述

<think>好的,我现在需要解释用户提供的这个函数static void UART8_to_RC(...)。首先,我得仔细看看代码结构,理解每个部分的作用。用户提到这是一个将UART8数据转换为遥控器控制结构的函数,可能用于机器人控制。 首先,函数参数是两个指针:ext_remote_control_t *Robot_Command和RC_ctrl_t *rc_ctrl_uart8。看起来是从Robot_Command提取数据,填充到rc_ctrl_uart8指向的结构体中。 接下来看函数体。第一行是rc_ctrl_uart8->rc.s[1]=3; 这里可能是在设置遥控器的某个状态或模式,比如手动或自动,但具体含义需要看结构体定义。不过用户没给出结构体,可能需要根据命名推测。 然后是rc_ctrl_uart8->rc.s[0]=rc_s0; 这里可能将另一个变量rc_s0的值赋给s[0],但rc_s0在参数里没有,可能是一个全局变量或外部变量,这可能会影响函数的可移植性,需要注意。 接下来处理鼠标的x、y、z坐标,分别从Robot_Command的mouse_x等字段复制到rc_ctrl_uart8的mouse结构体中。这部分比较直观,应该是传递鼠标的位置数据。 然后是左右键的按下状态,将left_button_down和right_button_down赋值给press_l和press_r。这部分处理鼠标按键。 最后是key.v,这里使用了强制类型转换,将keyboard_value转换为uint16_t指针再解引用。可能因为keyboard_value本身是其他类型,比如32位,但目标结构体需要16位,所以取低16位。但这样的转换可能有风险,特别是如果keyboard_value不是兼容类型的话,会导致数据错误。 需要指出代码中的潜在问题,比如rc_s0的来源,强制类型转换的安全性,以及可能的位域问题。同时,函数名中的UART8可能表示通过UART8接收数据,但函数本身没有处理通信部分,只是数据转换。 总结来说,这个函数的作用是将外部遥控数据映射到内部使用的遥控器结构体,可能用于不同模块间的数据交互。需要提醒用户注意代码中的隐式依赖和类型转换风险。</think>这个函数的作用是将`ext_remote_control_t`结构体中的遥控器/鼠标/键盘数据,映射到`RC_ctrl_t`结构体中,可能是为了将外部设备(如串口UART8)接收的指令转换为机器人控制信号。以下是逐行解析: --- ### **函数定义** ```c static void UART8_to_RC(ext_remote_control_t *Robot_Command, RC_ctrl_t *rc_ctrl_uart8) ``` - **`static`**:表示函数仅在当前文件内可见。 - **参数**: - `Robot_Command`:输入参数,指向外部遥控数据的结构体。 - `rc_ctrl_uart8`:输出参数,指向机器人控制结构体的指针。 --- ### **数据映射逻辑** #### 1. 设置遥控器通道开关 ```c rc_ctrl_uart8->rc.s[1] = 3; // 设置通道1开关值为3(可能表示某种模式) rc_ctrl_uart8->rc.s[0] = rc_s0; // 通道0开关值来自外部变量rc_s0(需确认rc_s0来源) ``` - **推测**:`rc.s[0]`和`rc.s[1]`可能表示遥控器的物理开关状态(如控制模式切换)。 --- #### 2. 鼠标数据映射 ```c rc_ctrl_uart8->mouse.x = Robot_Command->mouse_x; // 鼠标X坐标 rc_ctrl_uart8->mouse.y = Robot_Command->mouse_y; // 鼠标Y坐标 rc_ctrl_uart8->mouse.z = Robot_Command->mouse_z; // 鼠标Z坐标(可能为滚轮) rc_ctrl_uart8->mouse.press_l = Robot_Command->left_button_down; // 左键按下状态 rc_ctrl_uart8->mouse.press_r = Robot_Command->right_button_down; // 右键按下状态 ``` - **作用**:将外部鼠标的坐标和按键状态传递到控制结构体中。 --- #### 3. 键盘数据映射 ```c rc_ctrl_uart8->key.v = *(uint16_t *)&Robot_Command->keyboard_value; ``` - **关键操作**: - `keyboard_value`被强制转换为`uint16_t`指针,然后解引用赋值给`key.v`。 - **潜在风险**:如果`keyboard_value`的实际类型不是`uint16_t`,可能导致数据截断或未定义行为。 - **推测**:`keyboard_value`可能是一个32位或更大类型(如`uint32_t`),但目标结构体`key.v`仅需低16位。 --- ### **潜在问题** 1. **依赖隐式全局变量**: - `rc_s0`未通过参数传入,而是直接使用,可能引发多线程安全问题或维护困难。 2. **强制类型转换风险**: - `*(uint16_t *)&Robot_Command->keyboard_value`假设`keyboard_value`的内存布局与`uint16_t`兼容,需确保两端数据类型一致。 3. **硬件耦合**: - 函数名`UART8_to_RC`暗示与UART8通信相关,但函数内未处理通信协议,仅做数据映射,需结合上下文理解。 --- ### **典型应用场景** 此函数可能用于: 1. 从串口UART8)接收遥控数据后,将其转换为机器人控制模块所需的格式。 2. 在多控制源(如手柄、键盘、鼠标)的系统中,统一不同输入设备的接口。 --- ### **改进建议** 1. **显式传递`rc_s0`**: ```c static void UART8_to_RC(..., uint8_t rc_s0) // 将rc_s0作为参数传入 ``` 2. **确保类型安全**: ```c rc_ctrl_uart8->key.v = (uint16_t)Robot_Command->keyboard_value; // 显式截断 ``` 3. **注释开关值含义**: - 明确`rc.s[1] = 3`的具体意义(如模式切换编码)。 如果需要更深入分析,请提供`ext_remote_control_t`和`RC_ctrl_t`的结构体定义。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值