hi3516 内核开启UART支持


原文链接: hi3516 内核开启UART支持

二)查看串口配置
可以使用linux的stty命令查看串口的配置参数。比如:stty -F /dev/ttyAMA0 -a
同样可以使用stty命令设置串口参数,比如:stty -F /dev/ttyAMA0 ispeed 115200 ospeed 115200 cs8

(三)查看串口数据收发
    一般调试串口,我们可以将TX与RT接在一起,自己发数据给自己接收,看数据是否正常。也可以使用cat 查看串口数据或是echo发送数据。
发送数据:

    echo "test 1234567890" > /dev/ttyAMA0
接收数据: 

    cat /dev/ttyAMA0

(四)查看串口硬件分配:
    串口的硬件分配状态,比如IO和中断使用情况可以在/proc/tty/driver下的ttyAMA 种查看:

/proc/tty/driver # ls
ttyAMA     usbserial
/proc/tty/driver # cat ttyAMA 
serinfo:1.0 driver revision:
0: uart:PL011 rev2 mmio:0x12080000 irq:38 tx:119786 rx:254 RTS|DTR|DSR|CD|RI
1: uart:PL011 rev2 mmio:0x12090000 irq:39 tx:48102 rx:0 CTS|DSR|CD|RI
2: uart:PL011 rev2 mmio:0x120A0000 irq:40 tx:8620 rx:55014 CTS|DSR|CD|RI
(五)注意
    如果串口的配置和数据的收发命令都能够正常,但是串口的引脚没有电平变化,这个可能是串口的复用功能没有设置,需要设置一下GPIO复用为串口功能。复用功能可以在设备树dts中设置,也可以使用海思的himm命令直接设置:

    himm 0x120f0100 0x01   #UART2_RXD 

himm 0x120f0104 0x01   #UART2_TXD

————————————————
版权声明:本文为CSDN博主「li_wen01」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/li_wen01/article/details/86529523

启用并测试USART3

ln -s /bin/btools /bin/himm
himm 0x114F0000 0x532 		#RX
himm 0x114F0004 0x432 		#TX
mknod /dev/ttyAMA3 c 204 67
cat /dev/ttyAMA3 &
echo -e "AT+GSN\r\n" >/dev/ttyAMA3

默认波特率为 9600 8N1

如何添加串口1与串口2支持?

vi arch/arm/boot/dts/hi3516dv300.dtsi

aliases {
    serial0 = &uart0;
    // serial1 = &uart1;
    // serial2 = &uart2;
    serial3 = &uart3;         //   这句话决定在/dev/下生成对文件是 ttyAMA3 还是ttyAMA1
}

只需在vi arch/arm/boot/dts/hi3516dv300-demb.dts中按照

&uart0 {
        status = "okay";
};
&uart1 {
        status = "okay";
};
&uart2 {
        status = "okay";
};
&uart3 {
        status = "okay";
};

之后重新编译内核,make uImage

解决UART3不可用的问题,由时钟问题

echo "aaaa" >ttyAMA3
------------[ cut here ]------------
WARNING: CPU: 0 PID: 164 at drivers/tty/serial/serial_core.c:440 uart_get_baud_rate+0xec/0x14c
Modules linked in: hi_mipi_rx(O) hi3516cv500_acodec(PO) hi3516cv500_adec(PO) hi3516cv500_aenc(PO) hi3516cv500_ao(PO) hi3516cv500_ai(PO) hi3516cv500_aio(PO) hi3516cv500_hdmi(PO) hi_sensor_spi(O) hi_sensor)
CPU: 0 PID: 164 Comm: sh Tainted: P W O 4.9.37 #

解决方法: 另外hi3516dv300的uart3有个bug,缺少对UART3时钟的配置 kernel/linux-4.9.y/
vi drivers/clk/hisilicon/clk-hi3516dv300.c文件中

static struct hisi_gate_clock hi3516dv300_gate_clks[] 在132行 添加一项:

    { HI3516DV300_UART3_CLK, "clk_uart3", "uart_mux3",CLK_SET_RATE_PARENT, 0x1b8, 3, 0, },

如下所示

static struct hisi_gate_clock hi3516dv300_gate_clks[] __initdata = {
			/* fmc */
			{ HI3516DV300_FMC_CLK, "clk_fmc", "fmc_mux",
				CLK_SET_RATE_PARENT, 0x144, 1, 0, },
			/* mmc */
			{ HI3516DV300_MMC0_CLK, "clk_mmc0", "mmc0_mux",
				CLK_SET_RATE_PARENT, 0x148, 1, 0, },
			{ HI3516DV300_MMC1_CLK, "clk_mmc1", "mmc1_mux",
				CLK_SET_RATE_PARENT, 0x160, 1, 0, },
			{ HI3516DV300_MMC2_CLK, "clk_mmc2", "mmc2_mux",
				CLK_SET_RATE_PARENT, 0x154, 1, 0, },
			/* uart */
			{ HI3516DV300_UART0_CLK, "clk_uart0", "uart_mux0",
				CLK_SET_RATE_PARENT, 0x1b8, 0, 0, },
			{ HI3516DV300_UART1_CLK, "clk_uart1", "uart_mux1",
				CLK_SET_RATE_PARENT, 0x1b8, 1, 0, },
			{ HI3516DV300_UART2_CLK, "clk_uart2", "uart_mux2",
				CLK_SET_RATE_PARENT, 0x1b8, 2, 0, },
			// 132行增加uart3的配置
			{ HI3516DV300_UART3_CLK, "clk_uart3", "uart_mux3",
				CLK_SET_RATE_PARENT, 0x1b8, 3, 0, },
			{ HI3516DV300_UART4_CLK, "clk_uart4", "uart_mux4",
				CLK_SET_RATE_PARENT, 0x1b8, 4, 0, },
			/* i2c*/
			{ HI3516DV300_I2C0_CLK, "clk_i2c0", "50m",
					CLK_SET_RATE_PARENT, 0x1b8, 11, 0, },
			{ HI3516DV300_I2C1_CLK, "clk_i2c1", "50m",
					CLK_SET_RATE_PARENT, 0x1b8, 12, 0, },				
  1. 下载调试并启动内核
    setenv serverip 192.168.100.100;setenv ipaddr 192.168.100.10;mw.b 0x82000000 0xFF 0x300000;tftp 0x82000000 hi3516dv300-imx335/uImage;bootm 0x82000000

  2. 内核会自动创建 /dev/ttyAMA3 设备文件,如果没有创建则手动创建
    mknod /dev/ttyAMA1 c 204 65
    mknod /dev/ttyAMA2 c 204 66
    mknod /dev/ttyAMA3 c 204 67

  3. 配置UART3寄存器GPIO管脚为UART模式

利用himm 工具 复用为uart就可以进行操作了,
//RX //TX
himm 0x114F0000 0x532
himm 0x114F0004 0x432

  1. 测试串口,波特率默认为9600
    cat /dev/ttyAMA3

在启动脚本/etc/init.d/S00devs中修改

#!/bin/sh
mknod /dev/console c 5 1
mknod /dev/ttyAMA0 c 204 64
mknod /dev/ttyAMA1 c 204 65
+mknod /dev/ttyAMA2 c 204 66
+mknod /dev/ttyAMA3 c 204 67

///这里一定需要改,因为你是要串口3作为调试串口,而

添加串口的基地址,具体的地址可以在海思的文档中找到

进行过以上操作之后 内核中可以开启UART2了

不过在使用之前还需要开启端口复用,在ko文件中找到load3536 所启动的pinmux.sh/pinmux_socket_master.sh/

uart 1

himm 0x120F0134 0x01
himm 0x120F0138 0x01
himm 0x120F013C 0x01

URT2:
himm 0x120F0140 0x01

himm 0x120F0144 0x01

#UART3

开启 uart3

iocfg_reg19 V10 Pin HDMI_CEC IO Config Register.

0x114F_0004
31:11 保留。
10 电平转换速率控制,为0时电平转换速率快,为1时电平转换速率慢。
9 下拉电阻使能,高有效。
8 上拉电阻使能,高有效。
7:4 驱动能力,0~3对应IO驱动能力IO3_档位1~档位4。
3:0 "功能选择:

0:GPIO2_5
1:HDMI_CEC
2:UART3_TXD"

himm 0x114F0000 0x532 //RX
himm 0x114F0004 0x432 //TX

`