从零开始嵌入式

Thinking will not overcome fear but action will.

23_设备树控制LED灯

在设备树中建立led节点,编写简单驱动进行测试;以及使用pinctrl的方式控制led灯

获取GPIO编号的方式 建立LED节点 目标设备树文件:linux-4.14.2_iTop-4412_scp/arch/arm/boot/dts/exynos4412-itop-elite.dts 首先屏蔽文件中存在”&gpk1 1”、”&gpl2 0”的键值对。 然后在根节点/{…}内新增如下子节点,注意status属性为”okay” 1 2 3 4 5 6 my...

22_设备树建立简单节点及其测试

在设备树中建立简单节点,编写简单驱动进行测试

设备树语法 Linux DTS(Device Tree Source)设备树文件后缀为*.dts或*.dtsi,编译后文件为*.dtb。 设备树节点 1 2 3 4 [label:] node-name[@unit-address] { [property-name = value;] [child nodes]; }; 解释: node-name:节点名; la...

21_搭建设备树编译环境以及镜像烧写

介绍在Ubuntu12.04、WSL-Ubuntu18.04中搭建设备树编译环境,以及镜像烧写

Ubuntu12.04下搭建 提前准备好如下工具和文件: 工具 描述 使用方法 device-tree-compiler 设备树编译器(32bit) sudo apt-get install device-tree-compiler m...

20_内核定时器的使用

了解内核定时器及其使用

了解内容 内核定时器知识 宏定义:HZ决定时钟中断的频率,通过宏CONFIG_HZ设置,范围是100~1000; 全局变量:jiffies(节拍数,内核定时器产生中断次数),系统启动时该变量初始为0,故jiffies/HZ即内核启动的秒数。 开始 定时器的使用 1、定义定时器结构体timer_list; 1 static struct timer_list my_timer; ...

19_SPI的使用

介绍SPI读写rc522内部的reg

了解内容 SPI知识 SPI是4线的:SDI数据输入、SDO数据输出、SCLK时钟、CS片选。只有1根数据线也可以单向通信。 Linux SPI知识 和想象中不同的是我们不用根据时序图写spi的硬件操作函数,这部分已经被硬件实现控制层完成了。设备驱动(driver 驱动层)的工作仅是根据统一的spi设备操作函数完成配置和应用程序调用接口。 Linux中查看spi总线下的设备: 1...

18_I2C的使用

介绍如何读取和写入i2c芯片的数据寄存器

了解内容 I2C知识 I2C是2线的:SCL和SDA。无数据时SCL线是高电平,有数据时变为正常方波时钟信号。 SCL信号由主机控制。由图可知每一帧时钟保持9个周期,每帧有1字节数据,第9个时钟周期需要ACK(SDA为低)。 同一状态的首帧格式均是:从机地址(高7位)+读写状态(低0位,0为写,1为读); 主机写入n帧的实现,按照如下传输 ...

17_GPIO外部中断的使用

介绍使用GPIO上升下降沿触发外部中断

了解内容 Linux中查看系统中断的统计信息: 1 cat /proc/interrupts 接下来我们来实现BUTTON1、BUTTON2中断。在原理图中分别对应GPX1_1(home键)、GPX1_2(back键),相应中断号的宏分别是IRQ_EINT(9)、IRQ_EINT(10)。下图来自4412用户手册“2.5 Pin Description”章节。 开始 由于...

16_定时器的使用之输出PWM

介绍产生PWM控制无源蜂鸣器

了解内容 要产生PWM,首先要找到可以配置为定时器输出模式的GPIO。下图来自4412用户手册“2.5 Pin Description”章节。 可以看到GPD0[0]可以配置为定时器0输出模式,也就是TOUT_0模式。本文介绍使用该引脚输出PWM控制蜂鸣器发声。 结合4412用户手册“24 PWM Timer”章节内容,可以看到TCFG0、TCFG1控制分频影响模块时钟,TCMPB...

15_解决驱动中的竞态

介绍解决驱动竞态的方法

了解内容 比如我们想任意时刻只有一个系统app能正常调用驱动中open函数,就可以在open函数中实现互斥。 Linux操作系统中提供实现互斥的方法有:原子操作、自旋锁、信号量、互斥体等。 原子操作 原理是:声明一个变量(比如初始0),访问互斥资源时改值(+1),离开时还原值(-1);在访问之前判断该值是否为初始值(0),就可以知道该资源是否被占用。被占用时直接返回。 因为在文件中...

14_通过寄存器控制led灯

介绍不使用库函数而使用寄存器的方式控制led灯

了解内容 linux系统中不能直接操作物理地址,但是可以操作虚拟地址从而对寄存器进行操作。 使用void *ioremap(unsigned long start, unsigned long len)输入物理地址和字节长度,可返回虚拟地址指针。 准备内容 以LED2为例,在4412芯片上引脚为GPL2_0。 在三星用户手册中找到GPL2_0有3个主要寄存器: G...