Hi3519v101 uart驱动

25 篇文章 0 订阅
1 篇文章 0 订阅

一、说明

1、Hi3519v101 SDK已经将uart驱动写好了,可以直接使用。但内核默认只添加了uart0驱动,其他端口需要手动添加。uart驱动路径为:

drivers/tty/serial/amba-pl011.c

2、采用SDK的根文件系统启动后,可以在dev文件夹下面看到ttyAMA0、ttyAMA1。这是根文件系统添加的两个设备,但ttyAMA1并没有驱动,运用程序通过open函数是不能打开的。

/ # ls dev/ttyAMA*
dev/ttyAMA0  dev/ttyAMA1
/ #

根文件添加串口设备文件路径:

cat /home/osrc/Hi3519V101_SDK_V1.0.4.0/package/image_big-little/rootfs_uclibc_big-little/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/ttyS000 c 204 64
mknod /dev/null    c 1 3

查看驱动状态,只有uart0

/ # cat proc/tty/driver/ttyAMA
serinfo:1.0 driver revision:
0: uart:PL011 rev2 mmio:0x12100000 irq:36 tx:4976 rx:40 RTS|CTS|DTR|DSR|CD|RI

内核启动打印信息

Serial: AMBA PL011 UART driver
12100000.uart: ttyAMA0 at MMIO 0x12100000 (irq = 36, base_baud = 0) is a PL011 rev2
console [ttyAMA0] enabled

二、添加uart1驱动

未解决uart1无法打开问题,内核需要做如下修改

1、打开arch/arm/boot/dts/hisi-hi3519v101.dtsi

	aliases {
		serial0 = &uart0;
		serial1 = &uart1;//新增
		i2c0 = &i2c_bus0;

2、打开arch/arm/boot/dts/hisi-hi3519v101-hmp-demb.dts

&uart0 {
	status = "okay";
};

//新增
&uart1 {
	status = "okay";
};

3、打开arch/arm/boot/dts/hisi-hi3519v101-demb.dts

&uart0 {
	status = "okay";
};

//新增
&uart1 {
	status = "okay";
};

 

4、编译内核

make ARCH=arm CROSS_COMPILE=arm-hisiv500-linux- clean
make ARCH=arm CROSS_COMPILE=arm-hisiv500-linux- uImage

5、下载新内核,测试

内核启动信息

Serial: AMBA PL011 UART driver
12100000.uart: ttyAMA0 at MMIO 0x12100000 (irq = 36, base_baud = 0) is a PL011 rev2
console [ttyAMA0] enabled
12101000.uart: ttyAMA1 at MMIO 0x12101000 (irq = 37, base_baud = 0) is a PL011 rev2
SCSI subsystem initialized

驱动状态

# cat proc/tty/driver/ttyAMA
serinfo:1.0 driver revision:
0: uart:PL011 rev2 mmio:0x12100000 irq:36 tx:4976 rx:40 RTS|CTS|DTR|DSR|CD|RI
1: uart:PL011 rev2 mmio:0x12101000 irq:37 tx:0 rx:0 DSR|CD|RI

6、编写驱动文件、运用程序

uart/uart_drv.c  这里只做io复用配置

#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/delay.h>
#include <linux/ide.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/errno.h>
#include <linux/gpio.h>
#include <linux/cdev.h>
#include <linux/device.h>
#include <linux/of_gpio.h>
#include <linux/semaphore.h>
#include <linux/timer.h>
#include <linux/i2c.h>
#include <asm/mach/map.h>
#include <asm/uaccess.h>
#include <asm/io.h>

//spi gpio管脚复用物理地址 set 0x01 = spi mode
#define spi2_cs0_base 0x12040058
#define spi2_sclk_base 0x1204004c
#define spi2_sdo_base 0x12040050
#define spi2_sdi_base 0x12040054

//uart1 gpio管脚复用物理地址 set 0x01 = uart mode
#define uart1_rxd_base 0x1204008c
#define uart1_txd_base 0x12040094


#define gpio_phy_data 0x010 //gpio管脚数据偏移地址,0b00_0001_0000
#define gpio_phy_dir 0x400  //管脚方向寄存器偏移地址
#define gpio_out 0x4        //gpio3_2 配置为输出,1输出 0输入def
#define gpio_out_h 0xFF
#define gpio_out_l 0x00
#define spi2_mode 0x01
#define uart_mode 0x01

static void __iomem *spi2_cs0;
static void __iomem *spi2_sclk;
static void __iomem *spi2_sdo;
static void __iomem *spi2_sdi;


static void __iomem *uart_rxd;
static void __iomem *uart_txd;



static int __init uart_drv_init(void)
{
    //管脚复用配置  4个字节,32位
    uart_rxd = ioremap(uart1_rxd_base, 4);
    uart_txd = ioremap(uart1_txd_base, 4);

    iowrite32(uart_mode, uart_rxd);
    iowrite32(uart_mode, uart_txd);

    return 0;
}

static void __exit uart_drv_exit(void)
{
    iounmap(uart_rxd);
    iounmap(uart_txd);
}

module_init(uart_drv_init);
module_exit(uart_drv_exit);
MODULE_LICENSE("GPL");

uart/test_uart.c 这里没做串口参数配置,也可参考大佬的一篇文章《海思HI35xx平台串口配置方法》

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>

int main(int argc, char **argv)
{
	int fd;
	unsigned char val;
 
	fd = open("/dev/ttyAMA1", O_RDWR);	//打开设备
 
    if(fd < 0)
	{
		printf("can`t open!\n");
		return 0;	
	}
        

	if(argc != 2)
	{
		printf("Usage :\n");
		printf("%s <read|write>\n", argv[0]);
		return 0;
	}

	if (strcmp(argv[1], "read") == 0)
	{
		read(fd, &val, 1);
	}
	else
	{
		val = 0x55;
		write(fd, &val, 1);
		printf("write 0x%x\n", val);
	}
	
	return 0;
}

用示波器测试uart_txd管脚波形

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值