一、说明

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/shmknod /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 0x01static 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管脚波形

Hi3519v101 uart驱动相关推荐

  1. s3c6140 UART驱动设计

    s3c6140 UART驱动设计

  2. Linux设备驱动之UART驱动结构

    一.对于串口驱动Linux系统中UART驱动属于终端设备驱动,应该说是实现串口驱动和终端驱动来实现串口终端设备的驱动.要了解串口终端的驱动在Linux系统的结构就先要了解终端设备驱动在Linux系统中 ...

  3. usb serial port 驱动_tty初探 — uart驱动框架分析

    写在前面: 我们没有讲UART驱动,不过我们认为,只要系统学习了第2期,应该具备分析UART驱动的能力,小编做答疑几年以来,陆陆续续有不少人问到UART驱动怎么写,所以今天就分享一篇深度长文(1700 ...

  4. linux设备驱动之串口移植,Linux设备驱动之UART驱动结构

    一.对于串口驱动Linux系统中UART驱动属于终端设备驱动,应该说是实现串口驱动和终端驱动来实现串口终端设备的驱动.要了解串口终端的驱动在Linux系统的结构就先要了解终端设备驱动在Linux系统中 ...

  5. Linux uart驱动框架

    Linux uart驱动框架 串口驱动框架包括两部分 struct uart_driver int uart_register_driver(struct uart_driver *uart); vo ...

  6. CC2640R2F BLE5.0 CC2640R2F UART驱动

    UART驱动 这一节我们讲一下UART驱动的分层实现,UART APIs以及如何调用UART APIs来实现基本的串口打印. 概述 UART用于芯片和串行端口之间的数据传输,UART驱动程序经过多层的 ...

  7. 关于linux UART驱动和tty架构的理解

    关于linux UART驱动和tty架构的理解 最近要开发一个驱动程序,需要用到串口和SPI接口.平台的串口驱动程序本身在开发板中已经被实现了,也可以就这样直接使用,但是这样分开使用的结果就是在串口和 ...

  8. CP2101 usb转uart驱动

    CP2101 usb转uart驱动是官方提供的一款USB驱动,本站收集提供高速下载,用于解决USB接口不能正常识别,无法正常使用的问题,本动适用于:Windows XP / Windows 7 / W ...

  9. uart驱动框架及编程方法

    一.UART介绍 UART(Universal Asynchronous Receiver/Transmitter),中文全称为通用异步收发传输器,是一种异步收发传输器,它将要传输的数据通过并行到串行 ...

最新文章

  1. 酒店中计算机信息应用的重要性,浅析计算机在酒店管理中所体现的应用价值
  2. secureCRT脚本----vbs语法
  3. Jquery中实现表单提交到SSM后台前进行post请求实现数据的校验
  4. ubuntu 14.04使用devstack安装openstack mitaka版本
  5. 查看命令为内置命令还是外部命令
  6. CSharp 如何OCR离线识别文本
  7. 【Calcite】Calcite 的SQL解析
  8. OFFICE使用技术:让几个自选图形间距相等
  9. 基于 CODING 的 Spring Boot 持续集成项目 1
  10. 尚硅谷大数据Hadoop(1)技术之Hadoop(入门)
  11. LitePal数据存储
  12. 填坑---override、overload、overwrite
  13. 免费网站建设应该要掌握哪些?
  14. jqgrid冻结前后列
  15. 服务器系统能装打印机吗,现在云服务器怎么安装打印机
  16. 基于FPGA的DDS信号发生器
  17. html 前端优化上传视频,前端上传组件Plupload使用---上传大视频(分片上传)
  18. 1381:城市路(Dijkstra)
  19. UON:《Detecting Unexpected Obstacles for Self-Driving Cars...》论文阅读与总结
  20. flutter获取验证码输入框组件

热门文章

  1. 利用CASS使用三种方法计算两期土方
  2. matlab差值函数库,matlab教程之排序插值函数等
  3. 啃完这本阿里手册,应届七面进阿里
  4. C语言 程序的翻译 预处理 编译 汇编 链接 #define详解
  5. 安卓-无敌解决ListView添加标题头无法正常显示的问题(歪门邪道)
  6. 【路径规划】(2) A* 算法求解最短路,附python完整代码
  7. 分享两个小技巧,让你的PPT看起来更高级
  8. WPF触控程序开发(三)——类似IPhone相册的反弹效果
  9. win10 IE浏览器显示无法安全下载文件
  10. 锁客+裂变,这套玩法你觉得怎么样