![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Driver
River-D
知之者不如好之者,好之者不如乐之者。
展开
-
OLED显示屏
0.96寸白色OLED显示屏/64x128分辨率/SH1107控制芯片/4SPI详细解析OLED及相关代码ER_OLEDM1_CH1115_RPI原创 2022-01-21 10:34:42 · 470 阅读 · 0 评论 -
电容触摸屏
电容触摸屏GT911、GT928、GT9147的使用原创 2022-01-19 16:15:56 · 280 阅读 · 0 评论 -
Rockchip Boot option
Boot optionhttps://github.com/rockchip-linux/rkbinFirefly-RK3399笔记原创 2021-04-19 09:31:52 · 207 阅读 · 0 评论 -
android编译系统分析
android编译系统分析原创 2021-04-09 18:14:14 · 75 阅读 · 0 评论 -
LVDS之dts配置
LCD显示的一些基本概念以及DSI的一些clock解释HFP: Horizon front porchHBP: Horizon back porchVFP: Vertical front porchVBP: Vertical back porchHDP: Horizon display periodVDP: Vertical display periodHTP = HSYNC + HDP + HFP + HBPVTR = VSYNC + VDP + VFP + VBPLVDS接口详解原创 2021-04-08 15:52:03 · 3068 阅读 · 4 评论 -
Linux 阻塞和非阻塞 IO 实验
本章我们就来学习一下阻塞和非阻塞 IO,以及如何在驱动程序中处理阻塞与非阻塞,如何在驱动程序使用等待队列和 poll 机制。52.1 阻塞和非阻塞 IO52.1.1 阻塞和非阻塞简介 这里的 IO 指的是 Input/Output,也就是输入/输出,是应用程序对驱动设备的输入/输出操作。当应用程序对设备驱动进行操作的时候,如果不能获取到设备资源,那么阻塞式 IO 就会将应用程序对应的线程挂起,直到设备资源可以获取为止。对于非阻塞 IO,应用程序对应的线程不会挂起,它要么一直轮询...原创 2020-07-20 11:18:21 · 327 阅读 · 0 评论 -
Linux 中断实验
Linux 内核提供了完善的中断框架,我们只需要申请中断,然后注册中断处理函数即可,使用非常方便,不需要一系列复杂的寄存器配置。本章我们就来学习一下如何在 Linux 下使用中断。51.1 Linux 中断简介51.1.1 Linux 中断 API 函数先来回顾一下裸机实验里面中断的处理方法:①、使能中断,初始化相应的寄存器。②、注册中断服务函数,也就是向 irqTable 数组的指定标号处写入中断服务函数②、中断发生以后进入 IRQ 中断服务函数,在 IRQ 中断服务函数在数组 ...原创 2020-07-20 11:17:23 · 634 阅读 · 0 评论 -
Linux 内核定时器实验
Linux 时间管理和内核定时器简介50.1.1 内核时间管理简介 学习过 UCOS 或 FreeRTOS 的同学应该知道, UCOS 或 FreeRTOS 是需要一个硬件定时器提供系统时钟,一般使用 Systick 作为系统时钟源。同理, Linux 要运行,也是需要一个系统时钟的,至于这个系统时钟是由哪个定时器提供的,笔者没有去研究过 Linux 内核。 Linux 内核中有大量的函数需要时间管理,比如周期性的调度程序、延时程序、对于我们驱动编写者来说最常用的定时器。硬件定时器提原创 2020-07-20 11:16:26 · 510 阅读 · 0 评论 -
Linux 按键输入实验
在前几章我们都是使用的 GPIO 输出功能,还没有用过 GPIO 输入功能,本章我们就来学习一下如果在 Linux 下编写 GPIO 输入驱动程序。 I.MX6U-ALPHA 开发板上有一个按键,我们就使用此按键来完成 GPIO 输入驱动程序,同时利用第四十七章讲的原子操作来对按键值进行保护。49.1 Linux 下按键驱动原理按键驱动和 LED 驱动原理上来讲基本都是一样的,都是操作 GPIO,只不过一个是读取GPIO 的高低电平,一个是从 GPIO 输出高低电平。本章我们实现按键输...原创 2020-07-20 11:15:34 · 703 阅读 · 0 评论 -
Linux 并发与竞争
Linux是一个多任务操作系统,肯定会存在多个任务共同操作同一段内存或者设备的情况,多个任务甚至中断都能访问的资源叫做共享资源,就和共享单车一样。在驱动开发中要注意对共享资源的保护,也就是要处理对共享资源的并发访问。比如共享单车,大家按照谁扫谁骑走的原则来共用这个单车,如果没有这个并发访问共享单车的原则存在,只怕到时候为了一辆单车要打起来了。在 Linux 驱动编写过程中对于并发控制的管理非常重要,本章我们就来学习一下如何在 Linux 驱动中处理并发。47.1 并发与竞争1、并发与竞争简介原创 2020-07-20 11:12:51 · 586 阅读 · 0 评论 -
Linux 蜂鸣器实验
参考文献【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.3.pdf原创 2020-07-17 10:19:31 · 1152 阅读 · 0 评论 -
pinctrl和gpio子系统实验
Linux 内核提供了 pinctrl 和 gpio 子系统用于GPIO 驱动,本章我们就来学习一下如何借助 pinctrl 和 gpio 子系统来简化 GPIO 驱动开发。45.1 pinctrl 子系统45.1.1 pinctrl 子系统简介Linux 驱动讲究驱动分离与分层,pinctrl 和 gpio 子系统就是驱动分离与分层思想下的产物,驱动分离与分层其实就是按照面向对象编程的设计思想而设计的设备驱动框架,关于驱动的分离与分层我们后面会讲。本来 pinctrl 和 gpio 子系统应原创 2020-07-17 10:19:05 · 501 阅读 · 0 评论 -
设备树下的 LED 驱动实验
44.1 设备树 LED 驱动原理 在《第四十二章 新字符设备驱动实验》中,我们直接在驱动文件 newchrled.c 中定义有关寄存器物理地址,然后使用 io_remap 函数进行内存映射,得到对应的虚拟地址,最后操作寄存器对应的虚拟地址完成对 GPIO 的初始化。本章我们在第四十二章实验基础上完成,本章我们使用设备树来向 Linux 内核传递相关的寄存器物理地址, Linux 驱动文件使用上一章讲解的 OF函数从设备树中获取所需的属性值,然后使用获取到的属性值来初始化相关的 IO。本章实原创 2020-07-17 10:18:05 · 263 阅读 · 0 评论 -
Linux 设备树
43.1 什么是设备树?设备树(Device Tree),将这个词分开就是“设备”和“树”,描述设备树的文件叫做 DTS(DeviceTree Source),这个 DTS 文件采用树形结构描述板级设备,也就是开发板上的设备信息,比如CPU 数量、 内存基地址、 IIC 接口上接了哪些设备、 SPI 接口上接了哪些设备等等.在 3.x 版本(具体哪个版本笔者也无从考证)以前的 Linux 内核中 ARM 架构并没有采用设备树。在没有设备树的时候 Linux 是如何描述 ARM 架构中的板级信息呢原创 2020-07-17 10:17:25 · 709 阅读 · 2 评论 -
新字符设备驱动实验
register_chrdev 和 unregister_chrdev 这两个函数是老版本驱动使用的函数,现在新的字符设备驱动已经不再使用这两个函数,而是使用 Linux内核推荐的新字符设备驱动 API函数。本节我们就来学习一下如何编写新字符设备驱动,并且在驱动模块加载的时候自动创建设备节点文件。42.1 新字符设备驱动原理42.1.1 分配和释放设备号使用 register_chrdev 函数注册字符设备的时候只需要给定一个主设备号即可,但是这样会带来两个问题:①、需要我们事先确定好哪些原创 2020-07-17 10:15:51 · 290 阅读 · 0 评论 -
嵌入式 Linux LED 驱动开发实验
41.1 Linux 下 LED 灯驱动原理Linux 下的任何外设驱动,最终都是要配置相应的硬件寄存器。所以本章的 LED 灯驱动最终也是对 I.MX6ULL 的 IO 口进行配置,与裸机实验不同的是,在 Linux 下编写驱动要符合 Linux的驱动框架。41.1.1 地址映射在编写驱动之前,我们需要先简单了解一下 MMU 这个神器, MMU 全称叫做 MemoryManage Unit,也就是内存管理单元。在老版本的 Linux 中要求处理器必须有 MMU,但是现在Linux 内核已经支原创 2020-07-17 10:10:48 · 1204 阅读 · 0 评论 -
字符设备驱动开发
本章我们从 Linux 驱动开发中最基础的字符设备驱动开始,重点学习 Linux 下字符设备驱动开发框架。本章会以一个虚拟的设备为例,讲解如何进行字符设备驱动开发,以及如何编写测试 APP 来测试驱动工作是否正常,为以后的学习打下坚实的基础。40.1 字符设备驱动简介40.1 字符设备驱动简介字符设备是 Linux 驱动中最基本的一类设备驱动,字符设备就是一个一个字节,按照字节流进行读写操作的设备,读写数据是分先后顺序的。比如我们最常见的点灯、按键、 IIC、 SPI,LCD 等等都是字符设原创 2020-07-17 10:06:57 · 177 阅读 · 0 评论 -
ARM Linux 驱动开发简介
本篇我们将会详细讲解 Linux 中的三大类驱动:字符设备驱动、块设备驱动和网络设备驱动。其中字符设备驱动是占用篇幅最大的一类驱动,因为字符设备最多,从最简单的点灯到 I2C、 SPI、音频等都属于字符设备驱动的类型。块设备和网络设备驱动要比字符设备驱动复杂,就是因为其复杂所以半导体厂商一般都给我们编写好了,大多数情况下都是直接可以使用的。所谓的块设备驱动就是存储器设备的驱动,比如 EMMC、 NAND、 SD 卡和 U 盘等存储设备,因为这些存储设备的特点是以存储块为基础,因此叫做块设备...原创 2020-07-17 10:03:51 · 436 阅读 · 0 评论 -
系统烧写
前面我们已经移植好了 uboot 和 linux kernel,制作好了根文件系统。但是我们移植都是通过网络来测试的,在实际的产品开发中肯定不可能通过网络来运行,否则没网的时候产品岂不是就歇菜了。因此我们需要将 uboot、 linux kernel、 .dtb(设备树)和 rootfs 这四个文件烧写到板子上的 EMMC、 NAND 或 QSPI Flash 等其他存储设备上,这样不管有没有网络我们的产品都可以正常运行。本章我们就来学习一下如何使用 NXP 官方提供的 MfgTool 工具通过 U原创 2020-07-17 10:02:43 · 919 阅读 · 0 评论 -
根文件系统构建
根文件系统简介 根文件系统一般也叫做 rootfs,那么什么叫根文件系统?看到“文件系统”这四个字,很多人,包括我第一反应就是 FATFS、 FAT、 EXT4、 YAFFS 和 NTFS 等这样的文件系统。在这里,根文件系统并不是 FATFS 这样的文件系统代码, EXT4 这样的文件系统代码属于 Linux 内核的一部分。 Linux 中的根文件系统更像是一个文件夹或者叫做目录(在我看来就是一个文件夹,只不过是特殊的文件夹), 在这个目录里面会有很多的子目录。根目录下和子目录中会有很多的原创 2020-07-17 10:01:37 · 271 阅读 · 0 评论 -
Linux 内核移植
NXP 官方开发板 Linux 内核编译37.2.1 修改顶层 Makefile修改顶层 Makefile,直接在顶层 Makefile 文件里面定义 ARCH 和 CROSS_COMPILE 这两个的变量值为 arm 和 arm-linux-gnueabihf-37.2.2 配置并编译 Linux 内核和 uboot 一样,在编译 Linux 内核之前要先配置 Linux 内核。每个板子都有其对应的默认配 置 文 件 , 这 些 默 认 配 置 文 件 保 存 在 arch/arm/confi原创 2020-07-16 17:08:37 · 490 阅读 · 0 评论 -
Linux 内核启动流程
链接脚本 vmlinux.lds要分析 Linux 启动流程,同样需要先编译一下 Linux 源码,因为有很多文件是需要编译才会生成的。首先分析 Linux 内核的连接脚本文件 arch/arm/kernel/vmlinux.lds,通过链接脚本可以找到 Linux 内核的第一行程序是从哪里执行的。 vmlinux.lds 中有如下代码:示例代码 36.1.1 vmlinux.lds 链接脚本492 OUTPUT_ARCH(arm)493 ENTRY(stext)494 jiffies = j原创 2020-07-16 17:07:15 · 242 阅读 · 0 评论 -
Linux 内核顶层 Makefile 详解
Linux 内核获取Linux 由 Linux 基金会管理与发布, Linux 官网为 https://www.kernel.org,所以你想获取最新的Linux 版本就可以在这个网站上下载最新的稳定版 Linux 已经到了 5.1.4,大家没必要追新,因为 4.x 版本的 Linux 和 5.x 版本没有本质上的区别,5.x 更多的是加入了一些新的平台、新的外设驱动而已。NXP 会从 https://www.kernel.org 下载某个版本的 Linux 内核,然后将其移植到自己的 CPU上原创 2020-07-16 17:06:24 · 3693 阅读 · 0 评论 -
U-Boot 图形化配置及其原理
在前两章中我们知道 uboot 可以通过 mx6ull_alientek_emmc_defconfig 来配置,或者通过文件 mx6ull_alientek_emmc.h 来配置 uboot。还有另外一种配置 uboot 的方法,就是图形化配置,以前的 uboot 是不支持图形化配置,只有 Linux 内核才支持图形化配置。不过不知道从什么时候开始, uboot 也支持图形化配置了。U-Boot 图形化配置体验uboot 或 Linux 内核可以通过输入“ make menuconfig”来打开图原创 2020-07-16 17:05:09 · 456 阅读 · 0 评论 -
U-Boot 移植
NXP 官方开发板 uboot 编译测试1、查找 NXP 官方的开发板默认配置文件uboot 移植的一般流程:①、在 uboot 中找到参考的开发平台,一般是原厂的开发板。②、参考原厂开发板移植 uboot 到我们所使用的开发板上。正点原子的 I.MX6ULL 开发板参考的是 NXP 官方的 I.MX6ULL EVK 开发板做的硬件,因此我们在移植 uboot 的时候就可以以 NXP 官方的 I.MX6ULL EVK 开发板为蓝本。在移植之前,我们先编译一下 NXP 官方 I.MX6ULL E原创 2020-07-16 17:04:10 · 527 阅读 · 0 评论 -
U-Boot 启动流程详解
3、U-Boot 启动流程详解1、链接脚本 u-boot.lds 详解要分析 uboot 的启动流程,首先要找到“入口”,找到第一行程序在哪里。程序的链接是由链接脚本来决定的,所以通过链接脚本可以找到程序的入口。如果没有编译过 uboot 的话链接脚本为 arch/arm/cpu/u-boot.lds。但是这个不是最终使用的链接脚本,最终的链接脚本是在这个链接脚本的基础上生成的。编译一下 uboot,编译完成以后就会在 uboot 根目录下生成 u-boot.lds文件。只有编译 u-boot原创 2020-07-16 17:03:10 · 1359 阅读 · 0 评论 -
U-Boot 顶层 Makefile 详解
U-Boot 顶层 Makefile 详解1、U-Boot 工程目录分析我们在分析 uboot 源码之前一定要先在 Ubuntu 中编译一下 uboot 源码,因为编译过程会生成一些文件,而生成的这些恰恰是分析uboot 源码不可或缺的文件。使用上一章创建的 shell 脚本来完成编译工作,命令如下:cd alientek_uboot //进入正点原子 uboot 源码目录./mx6ull_alientek_emmc.sh //编译 ubootcd ../ //返回上一级目录tar -vcj原创 2020-07-16 16:42:26 · 1405 阅读 · 0 评论 -
U-Boot 简介
U-Boot 简介1、Linux 系统要启动就必须需要一个 bootloader 程序,也就说芯片上电以后先运行一段bootloader程序。这段 bootloader程序会先初始化 DDR等外设,然后将 Linux内核从 flash(NAND,NOR FLASH, SD, MMC 等)拷贝到 DDR 中,最后启动 Linux 内核。2、有很多现成的 bootloader 软件可以使用,比如 U-Boot、 vivi、 RedBoot 等等,其中以 U-Boot 使用最为广泛.3、uboot 的全称是原创 2020-07-16 16:39:07 · 1646 阅读 · 0 评论