【i.MX6ULL】驱动开发8--中断法检测按键
上篇,学习GPIO输入功能的使用,本篇,来学习使用中断的方式来检测按键的按下。
[TOC]
1 Linux中断介绍1.1 中断的上半部与下半部中断处理函数的执行,越快越好,但实际使用中,某些情况确实需要比较耗时是中断过程,为此,Linux内核将中断分为上半部和下半部两个处理部分:
上半部:中断处理函数,那些处理过程比较快,不会占用很长时间的处理就可以放在上半部完成
下半部:如果中断处理过程比较耗时,那么就将这些比较耗时的代码提出来,交给下半部去执行,这样中断处理函数就会快进快出
对于一个中断,如何划分出上下两部分呢?
对时间敏感,将其放在上半部
和硬件相关,将其放在上半部
要求不被其他中断打断,将其放在上半部
其他所有任务,考虑放在下半部
1.2 下半部的3种实现方式1.2.1 软中断Linux内核使用softirq_action结构体表示软中断:
1234struct softirq_action { void (*action)(struct softirq_action *); };
一共有 10 个软中断
1234567891011121314 ...
【i.MX6ULL】驱动开发7--按键输入捕获
前面几篇文章,从最基础的寄存器点灯,到设备树点灯,再到GPIO子系统点灯,一步步了解嵌入式Linux开发的各种点灯原理。
点灯用到的都是GPIO的输出功能,这篇,通过按键的使用,来学习GPIO输入功能的使用。
1 硬件介绍1.1 板子上按键原理图先来看原理图,我板子上有4个按键sw1~sw4:
1.1.1 SW1SW1是板子的系统复位按键,不可编程使用
1.1.2 SW2、SW3
SW2:SNVS_TAMPER1,GPIO5_1
平时是低电平,按下去是高电平。
SW3:ONOFF
它也是系统级的按键,用于长按进行开关机。
1.1.3 SW4SW4是BOOT_MODE1脚,用来进行串行烧录模式切换,需要再与复位键配合使用。
本篇仅测试按键功能,因此可以该按键。
1.1.4 使用其中2个按键板子上这4个按键的功能特性如下表:
本实验使用SW2和SW4这两个按键来进行实验。
2 软件编写2.1 修改设备树文件2.1.1 修改iomuxc节点修改imx6ull-myboard.dts,在iomuxc节点的imx6ull-evk字节点下创建一个名为pinctrl_key的子节点, ...
【i.MX6ULL】驱动开发6--Pinctrl子系统与GPIO子系统点亮LED
前面的两篇文章(寄存器配置点亮LED与设备树版的点亮LED),其本质都是通过寄存器配置,来控制LED的亮灭。
使用直接操作寄存器的方式,是将与LED有关的寄存器信息,直接写到了LED的驱动代码中,这也是一种比较常规的控制方式。但当芯片的寄存器发了变动,就要对底层的驱动进行重写。
使用设备树的方式,是将与LED有关的寄存器信息,写到了设备树文件中,这样,当设备的信息修改了,还可以通过设备树的接口函数,来获取设备信息,提高了驱动代码的复用能力。
本篇介绍的Pinctrl子系统与GPIO子系统的方式,不需要再直接操作寄存器了,因为这两个子系统已经替我们实现了对寄存器的操作,我们只需要操作这两个子系统提供的API函数即可。
[TOC]
1 Pinctrl子系统Pintrl子系统,顾名思义,就是管理pin引脚的一个系统,比如要点亮LED,即要控制LED对应引脚的高低电平,就要先通过Pintrl子系统将LED对应的引脚复用为GPIO功能(这一点是不是和之前寄存器配置时使用的MUX寄存器的功能有点像)。
1.1 设备树中iomuxc节点如何使用Pintrl子系统呢?其实它也是要依赖设备树的,先来 ...
【i.MX6ULL】驱动开发5--设备树原理与点亮
上篇文章(【i.MX6ULL】驱动开发4–点亮LED(寄存器版))介绍了在驱动程序中,直接操作寄存器了点亮LED。本篇,介绍另外一种点亮LED的方式——设备树,该方式的本质也是操作寄存器,只是寄存器的相关信息放在了设备树中,配置寄存器时需要使用OF函数从设备树中读取处寄存器数据后再进行配置。
[TOC]
1 什么是设备树1.1 背景介绍Linux3.x之前是没有设备树的,设备树是用来描述一个硬件平台的板级细节。对应ARM-Linux开发,这些板级描述文件存放在linux内核的 /arch/arm/plat-xxx和/arch/arm/mach-xxx 中。随着ARM硬件设备的种类增多,与板子相关的设备文件也越来越多,这就导致Linux内核越来越大,而实际这些ARM硬件相关的板级信息与Linux内核并无相关关系。
2011年,Linux之父Linus Torvalds发现这个问题后,就通过邮件向ARM-Linux开发社区发了一封邮件,不禁的发出了一句“This whole ARM thing is a f*cking pain in the ass”。之后,ARM社区就引入了Power ...
【i.MX6ULL】驱动开发4--点亮LED(寄存器版)
上篇文章(【i.MX6ULL】驱动开发3–GPIO寄存器配置原理),介绍了i.MX6ULL芯片的GPIO的工作原理与寄存器配置。
本篇,就要来实际操作一下GPIO,实现板子上LED灯的亮灭控制。
[TOC]
在介绍如何通过寄存器来控制LED之前,需要先来了解一下有关Linux地址映射相关的知识。
1 地址映射Linux或是STM32,对于硬件的控制,本质都是操作寄存器,在对应的地址进行数据的读写。若是在裸机开发中,可以控制CPU直接操作寄存器的地址,实现相应的功能,其过程是这样的:
linux环境,一般是不会直接访问物理内存,因为如果用户不小心修改了内存中的数据,很有可能造成错误甚至系统崩溃。为了避免这些问题,linux内核便引入了MMU和TLB进行内存地址映射,通过访问虚拟地址实现对实际物理地址的读写:
1.1 MMU介绍MMU,Memory Manage Unit,即内存管理单元,它提供统一的内存空间抽象,程序通过访问虚拟内存中的地址,MMU将虚拟地址(Virtual Address)翻译成实际的物理地址(Physical Address) ,之后CPU即可操作实际的物理地址。 ...
【i.MX6ULL】驱动开发3--GPIO寄存器配置原理
前面的两篇Linux驱动文章
【i.MX6ULL】驱动开发1–字符设备开发模板
【i.MX6ULL】驱动开发2–新字符设备开发模板
介绍了字符设备驱动的两种新旧开发方式,并使用一个虚拟的字符驱动来学习字符设备的开发的流程。
本篇起,就要来操作Linux开发板的硬件,首先当然是通过经典的点亮LED灯程序,来学习Linux IO口操作的字符设备开发流程。
对比STM32的点灯程序,有寄存器操作与库函数操作两种,但其本质都是在配置寄存器。
同样,i.MX6ULL也有多种点灯方式:
裸机系统:汇编操作寄存器点灯、C语言操作寄存器点灯
跑Linux系统:字符驱动LED点灯、设备树驱动LED点灯
究其本质,最终都是要操作i.MX6ULL的寄存器。比如,在控制GPIO引脚实现LED亮灭时,会进行类似如下的寄存器配置:
123456/* 寄存器物理地址 */#define CCM_CCGR1_BASE (0X020C406C) #define SW_MUX_SNVS_TAMPER3_BASE (0X02290014)#define SW_PAD_SNVS_TAMPER3_BASE ...
【图解】物联网设备的N种Wi-Fi配网方式
[TOC]
1 背景介绍物联网时代,各种各样的智能物联网设备正走进我们我们的生活,智能门锁、摄像头、猫眼门铃、扫地机、智能音箱、空气净化器、体脂秤等等。
这些物联网设备都有一个共同的特征,就是可以联网,通过配套的手机APP,可以实现对设备的监控和操作。
比如家用的无线监控摄像头,通过对应的手机APP可以实现视频的实时查看,以及反过来对摄像头的角度旋转控制。当然,要想使用这些功能,首先需要将买来的摄像头进行联网,也就是连接到自家的Wi-Fi路由器中,通过路由器连接互联网(细化的是指该设备对应的物联网云服务器,或称云平台)。
那这些物联网设备,具体是通过怎样的方式连接到Wi-Fi路由器上的呢?
2 Wi-Fi基础知识2.1 STA模式与AP模式首先介绍Wi-Fi的两种工作模式:STA模式与AP模式。
STA模式:Station,即Wi-FI工作在无线终端模式,通过连接AP热点连接到网络
AP模式:Access Point,即Wi-Fi工作在热点模式,其它设备可以连接到此节点(AP热点)
怎么理解这两种模式呢,如下图左,家里的Wi-Fi路由器,它的Wi-Fi就工作在AP模式,它就 ...
【i.MX6ULL】驱动开发2--新字符设备开发模板
上篇文章介绍了字符设备的开发模板,但那是一种旧版本的驱动开发模式,设备驱动需要手动分配设备号再使用 register_chrdev进行注册,加载成功以后还需要手动使用mknod命令创建设备节点,比较麻烦。
目前Linux内核推荐的新字符设备驱动API函数,使得驱动的使用更加自动化,本篇就来一起研究下。
先看目录:
[TOC]
1 旧字符设备驱动的弊端使用register_chrdev函数注册字符设备,需要指定一个设备号,这就造成:
需要事先确定好哪些主设备号没有使用
会将一个主设备号下的所有次设备号都使用掉,比如主设备号为200,那么 0~1048575(2^20-1)这个区间的次设备号就全部都被占用了
回顾上一篇的操作,先是加载驱动:
加载完,还有手动使用mknod指令来手动创建该设备节点,并且指定驱动程序中写死的设备号:
本篇,就要使用一种新的字符驱动编写方式,实现设备号的自动分配,省去mknod指令操作。
2 新字符设备驱动原理2.1 分配和释放设备号使用设备号的时候向Linux内核申请,需要几个就申请几个,由Linux内核分配设备可以使用的设备号。
使用如下函数来申请设 ...
【i.MX6ULL】驱动开发1--字符设备开发模板
之前的几篇文章(从i.MX6ULL嵌入式Linux开发1-uboot移植初探起),介绍了嵌入式了Linux的系统移植(uboot、内核与根文件系统)以及使用MfgTool工具将系统烧写到板子的EMMC中。
本篇开始介绍嵌入式Linux驱动开发。
内容较多,先看目录:
[TOC]
1 Linux驱动分类Linux中的外设驱动可以分为三大类:字符设备驱动、块设备驱动和网络设备驱动。
字符设备驱动:字符设备是能够按照字节流(比如文件)进行读写操作的设备。字符设备最常见,从最简单的点灯到I2C、SPI、音频等都属于字符设备驱动
块设备驱动:以存储块为基础的设备驱动,如EMMC、NAND、SD卡等。对用户而言,字符设备与块设备的访问方式没有差别。
网络设备驱动:即网络驱动,它同时具有字符设备和块设备的特点,因为它是输入输出是有结构块的(报文,包,帧),但它的块的大小又不是固定的。
2 Linux驱动基本原理在Linux中一切皆文件,驱动加载成功以后会在“**/dev”目录下生成一个相应的文件,应用程序通过对这个名为“/dev/xxx**”的文件进行相应的操作即可实现对硬件的操作。
比如 ...
i.MX6ULL嵌入式Linux开发6-系统烧写到eMMC与遇到的坑!
前面几篇文章,已经搞定了Linux移植三巨头:uboot、kernel(包含dtb)和rootfs,除了uboot是烧写在SD中的,其它的都是在ubuntu虚拟机的nfs服务器中,运行时必须通过网络将这些文件加载到开发板的内存中运行。
本篇就来研究,将这几个文件打包烧写到板子的eMMC中,实现嵌入式Linux系统的烧写,这样,在没有网络的情况下,板子也可以正常运行。系统烧写使用的是NXP官方的MfgTool工具,通过USB OTG口来烧写。
[TOC]
1 MfgTool介绍MfgTool是NXP官方提供的用于烧写i.MX系列CPU的系统烧写工具,该软件需要在Windows环境下使用。
这是使用正点原子提供的已经下载好的NXP烧写工具:L4.1.15_2.0.0-ga_mfg-tools.tar.gz。
将软件包解压,里面还有2个.gz 压缩包,一个是带rootfs,一个是不带rootfs,我们是需要烧写文件系统的,所以选择 mfgtools-with-rootfs.tar.gz 这个压缩包,继续解压。
进入目录 mfgtools-with-rootfs\mfgtools 中, ...