Linux 内核中 UART 驱动的接口及使用方法,为 UART 设备的使用者提供参考。...2 模块介绍 2.1 模块功能介绍 Linux 内核中,UART 驱动的结构图 1 所示, 可以分为三个层次: 图 2-1: Linux UART 体系结构图 Sunxi UART Driver...include #include #include #include 4.2 读/写串口 同样使用标准的文件读写函数...端口的寄存器值、收发数据的统计等。...端口的一些运行状态信息,包括控制器的各寄存器值。
chips/t113/configs/evb1/sys_config.fex 中的 uart_debug_port 修改前: [uart_para] uart_debug_port = 0 uart_debug_tx...= port:PF02 uart_debug_rx = port:PF04 修改后 [uart_para...] uart_debug_port = 0 uart_debug_tx = port:PE02 uart_debug_rx = port:PE03...> ^ ^ PE2脚 引脚功能6(查阅datasheet得知) 修改设备树(Linux使用的串口输出) 路径:device/config/chips.../t113/configs/evb1/board.dts 修改前 uart0_pins_a: uart0_pins@0 { /* For EVB1 board */ pins = "PF2", "PF4
场景二:使用UART3,需要从UART0改为UART3(PB6,PB7) 修改sys_config.fex(BOOT0与Uboot的串口) sys_config.fex 的路径是 device/config.../chips/t113/configs/evb1/sys_config.fex 中的 uart_debug_port 修改前: [uart_para] uart_debug_port = 0 uart_debug_tx...] uart_debug_port = 3 uart_debug_tx = port:PB06 uart_debug_rx = port:PB07... 修改设备树(Linux使用的串口输出) 路径:device/config/chips/t113/configs/evb1/board.dts 修改前 uart3...找到 Kernel low-level debugging functions,修改寄存器地址 RISC-V 不需要此操作 原贴链接:https://bbs.aw-ol.com/topic/1673
全志平台通读写寄存器的方法 echo 寄存器值 > /sys/class/sunxi_dump/dump cat dump 查看写进去的值 echo 寄存器值 > /sys/class/...到全志一号通查阅对应芯片的user_manual,看想查的寄存器的位置是多少 如,将PH8配作spi0的mosi 2. io口的基地址0x01C2 0800 PH Configure Register...查到PH8_SELECT Bit 2:0(0到2位): PH8_SELECT 000: Input 001: Output 010: SPI0_MOSI 011: UART3_RTS 100: Reserved...101: Reserved 110: Reserved 111: IO Disable 所以如果PH8配成spi 的mosi的话,应该是 0x00000022 32位寄存器: 0000 0000 0000...再查spi0对应的寄存器的数值: R16 spi0 - 0x01C6 8000 --- 0x01C6 8FFF (size 4K) root@mico:/sys/class/sunxi_dump# echo
直接基于IO的虚拟地址用指针解引用的方式来读写有两种方式,静态映射和动态映射。除了可以直接将指针解引用的方式,内核中提供了专用的读写接口来读写寄存器。...(S3C_VA_UART + 0x800) #define S5P_VA_UART3 (S3C_VA_UART + 0xC00) #define S3C_UART_OFFSET...静态映射方式操作寄存器简单暴力,直接包含mach/gpio-bank.h头文件,使用其中定义的宏转成指针后解引用即可,例如下面的GPJ0CON直接当做一个变量读写即可。...iounmap(GPJ0DAT_VA); release_mem_region(GPJ0CON_PA, 4); release_mem_region(GPJ0DAT_PA, 4); 寄存器读写接口...考虑到尽可能强的程序移植性,应使用内核提供的专有的读写接口来读写寄存器。
写这篇文章的原因:因为在linux开发串口应用的时候,遇到了问题,让遇到相同问题的人少走点弯路: ①读串口数据的时,需要接受换行符才能返回。...Linux 没有实现这一位,总是将它视为已设置。 ②c_oflag: OPOST:启用具体实现自行定义的输出处理。...FLUSHO:(不属于 POSIX; Linux 下不被支持) 输出被刷新。这个标志可以通过键入字符 DISCARD 来开关。...main( int argc, char *argv[]) { int fd; int ret; char buff[1024]; char senddata[] = "uart...fd= open("/dev/ttyS2", O_RDWR | O_NOCTTY | O_NONBLOCK); if(fd <= 0) { printf("uart
读写锁 与互斥量类似,但读写锁允许更高的并行性。其特性为:写独占,读共享。 读写锁状态: 一把读写锁具备三种状态: 1. 读模式下加锁状态 (读锁) 2. 写模式下加锁状态 (写锁) 3....不加锁状态 读写锁特性: 1. 读写锁是“写模式加锁”时, 解锁前,所有对该锁加锁的线程都会被阻塞。 2....那么读写锁会阻塞随后的读模式锁请求。优先满足写模式锁。读锁、写锁并行阻塞,写锁优先级高 读写锁也叫共享-独占锁。当读写锁以读模式锁住时,它是以共享模式锁住的;当它以写模式锁住时,它是以独占模式锁住的。...读写锁非常适合于对数据结构读的次数远大于写的情况。...函数 以读方式请求读写锁。
一、读写锁是什么?...读写锁其实还是一种锁,是给一段临界区代码加锁,但是此加锁是在进行写操作的时候才会互斥,而在进行读的时候是可以共享的进行访问临界区的 ps:读写锁本质上是一种自旋锁 二、为什么需要读写锁?...如果每次操作都给此段代码加锁,太浪费时间了而且也很浪费资源,降低程序的效率,因为读操作不会修改数据,只是做一些查询,所以在读的时候不用给此段代码加锁,可以共享的访问,只有涉及到写的时候,互斥的访问就好了 三、读写锁的行为...读写之间是互斥的—–>读的时候写阻塞,写的时候读阻塞,而且读和写在竞争锁的时候,写会优先得到锁 四、自旋锁&挂起等待是锁?...---->读和写在同时竞争锁的时候,写会优先的得到锁 互斥---->读的时候写阻塞,写的时候读阻塞 4.相关函数 (1)pthread_rwlock_init()—->初始化函数 功能:初始化读写锁
QEMU virt 平台支持运行多种操作系统,包括 Linux、Android 等。...Machine模式下,所以我们先关注如何读写Machine模式下的CSR寄存器 我们关注的是最上面的Machine Information Registers这组寄存器,这组寄存器中存放了当前机器的相关状态信息...为了读写这组状态寄存器,我们需要使用专门的CSR指令: CSRRW指令(原子读写CSR寄存器): 一般可用于实现两个寄存器值的交换,并且这个过程是原子性的,不可打断 如果RD位为x0,则相当于将...(LCR, lcr | (3 << 0)); } 相关宏定义: //读写uart寄存器的相关宏定义 #define uart_read_reg(reg) (*(UART_REG(reg))) #define...---- NS16550a 的数据读写 TSR寄存器(Transmit Status Register)是一个用于发送状态信息的寄存器,通常在串口通信芯片中存在。
,线的两端各有一个UART芯片,键盘输入字符,先到达UART芯片中控制寄存器,然后UART发起中断,等待CPU响应。...图片2 UART读写流程UART是每次读写1B,效率较慢,内存统一编址,UART地址是0x10000000L,涉及THR(发送寄存器)、RHR(接收寄存器)、IER(中断控制寄存器)、LCR(行控制寄存器...top:应用进程通过read/write从buffer中读写数据是top部分。...三、console1 基本概念控制台设备通过UART每次读写数据,每次读写一行,console对用户层表现的是文件描述符,是设备类型的。...,创建了标准输入流、标准输出流、标准错误流,其实是同一个文件,都可以读写。
PCLK // UART0的时钟源设为PCLK #define UART_BAUD_RATE 57600 // 波特率 #define UART_BRD...((UART_CLK / (UART_BAUD_RATE * 16)) - 1) /* * 初始化UART0 * 115200,8N1,无流控 */ void uart0_init(void)...(UTRSTAT0 & TXD0READY)); /* 向UTXH0寄存器中写入数据,UART即自动将它发送出去 */ UTXH0 = c; } /* * 打印一串数字 * num..._init //初始化uart ... ......nand和nor上的地址,只能读写2440的内部地址(4096),若SDRAM已初始化,也可以实现读写) load_image 将文件载入地址为 address
cd sys/class/sunxi_dump 把要读写的地址写到dump里 root@TinaLinux:/sys/class/sunxi_dump# echo 0x07010310 > dump 读出来看一下
learn the auth of Linux.
在一个结构体中定义各连续的寄存器(每个寄存器占四个字节),然后将offset 首地址ioremap,得到的地址传给结构体指针。然后操作寄存器的时候,就操作结构体成员就ok了。
一、寄存器描述 本篇所写的uart接口的内部寄存器的定义如下表: 寄存器名 地址 属性 说明 复位寄存器 0x00 w/r 低3位才有意义,第0位用于对发送电路进行复位,第1位用于对接收电路进行复位,第...分频控制寄存器 0x01 w/r 用于对内部分频计数器进行读写操作,以使uart满足不同的波特率。 发送寄存器 0x02 w 用于将需要发送的数据锁存到这个寄存器中。...命令寄存器 0x03 w 低1位有意义,写这个寄存器会产生一个时钟宽度的控制信号,这个控制信号用于通知发送电路可以发送数据了。 接收寄存器 0x04 r 只读,用于存储当前接收到的完整数据。...uart_xmt.v和uart_rcv.v中各有一个状态机,uart_ctl.v中有两个状态机,这里不给出过多的解释,代码中我都给出了详细注释。...代码中的CPU的读写操作和自动比对操作都必须定义成任务,不能定义成函数,因为任务是要花费仿真时间的。
写在前面 正文 关于UART的介绍 UART通信过程 UART、RS232以及TTL之间的关系 UART的使用场合 有关UART的总结 UART的Verilog实现 UART和移位寄存器之间的关系?...参考资料 交个朋友 ---- 写在前面 相关博文1:详解移位寄存器[1] 相关博文2:uart的一些相关博客[2] 个人微信公众号:FPGA LAB 个人博客首页[3] 注:学习交流使用!...相关博文1单独介绍了各种类型的移位寄存器,其中就包括串行输入并行输出移位寄存器(SIPO)以及并行输入串行输出移位寄存器 (PISO)。...发送UART将从主板接收一个字节,然后使用其PISO(并行输入串行输出)内部移位寄存器首先发送一个“起始”位,以与接收UART交流即将传输信息的信息。...UART和移位寄存器之间的关系? 为什么说UART中使用了移位寄存器呢?
PCLK // UART0 的时钟源设置为 PCLK #define UART_BAUD_RATE 115200 // 波特率 #define UART_BRD...(UTRSTAT0 & TXD0READY)); /* 向 UTXH0 寄存器中写入数据,UART即自动将它发送出去 */ UTXH0 = c; } unsigned.../* * Init Nand Flash Device * Return: None */ void nand_init(void) { /* NandFlash 的读写需要满足一定的时序...LD = arm-linux-ld AR = arm-linux-ar OBJCOPY = arm-linux-objcopy OBJDUMP = arm-linux-objdump...比如:如何配系统时钟、如何初始化串口、NandFlash 的存储和读写机制是怎么处理的等等。 ---- 欢迎转载,请尊重版权,保留全部内容并注明来源。
设备的编程手册包含了它有什么样的寄存器,它能执行什么样的操作,在读写控制寄存器的时候,设备会如何响应。不过通常来说,设备的手册不如RISC-V的手册清晰,这会使得对于设备的编程会更加复杂。...类似于读写内存,通过向相应的设备地址执行load/store指令,我们就可以对例如UART的设备进行编程。...通常情况下,驱动中会有一些队列(或者说buffer),top部分的代码会从队列中读写数据,而Interrupt handler(bottom部分)同时也会向队列中读写数据。...load/store指令实际上的工作就是读写设备的控制寄存器。 例如,对网卡执行store指令时,CPU会修改网卡的某个控制寄存器,进而导致网卡发送一个packet。...所以这里的load/store指令不会读写内存,而是会操作设备。并且你需要阅读设备的文档来弄清楚设备的寄存器和相应的行为,有的时候文档很清晰,有的时候文档不是那么清晰。
也就是说,CPU复位之后,会首先将0x0000地址的内容加载到栈寄存器sp中,然后将0x0004地址的内容加载并保存到指令寄存器pc中,然后才开始执行第一条指令。...在软件上向UART发送数据实际上是通过向APB总线发送数据到UART硬件对应的接口,发送数据的操作通过将APB总线的读写映射为MMIO实现,简单来说就是通过CPU向内存读写数据实现总线上的读写操作。...的读写主要通过对UART本身的寄存器操作实现,例如向串口写一个字节就是:USART->TDR = 0x41,具体的写入内容根据型号有所差异,在STM32F4XX的驱动中相关代码如下: /**...实际上在MCU中printf和puts等函数的实现都是通过逐字节写入UART寄存器实现的。...此外还介绍了如何通过控制串口在裸机上实现了一简单的HelloWorld应用,这实际上是一个简化的外设驱动,即通过总线读写外设寄存器来封装外部硬件的调用,这部分代码在内核中也是相当常见的。
使用hdparm工具或者time、dd命令测试硬盘读写性能 # hdparm for i in {0..9}; do hdparm -tT /dev/sdc; done root in summer
领取专属 10元无门槛券
手把手带您无忧上云