![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
driver
文章平均质量分 86
你板子冒烟了
这个作者很懒,什么都没留下…
展开
-
原子linux开发板复习
烧写系统有两种方式:1、利用nxp提供,被正点原子修改过的上位机软件mfgtool,将uboot,zImage,文件系统直接烧写到emmc。2、首先向sd卡烧写一个系统,然后使用sd卡启动,启动以后利用这个系统将三者烧写到emmc中,速度较慢,因为此时完全是靠开发板的cpu来运行。uboot主要任务:1、初始化ddr等外设2、将zImage、设备树等从外部存储(如emmc)复制到ddr,并运行内核。...原创 2021-10-11 22:45:21 · 91 阅读 · 0 评论 -
63 串口驱动(232,485,GPS)
一、串口驱动框架两个重要的结构体 uart_port 和 uart_driveruart_driver 需要驱动开发者实现并注册。注册使用 int uart_register_driver(struct uart_driver *drv);注销使用 void uart_unregister_driver(struct uart_driver *drv);uart_port 用于描述一个具体的端口。 也需要驱动开发者实现。添加 uart_port 到内核:int uart_add_one_port原创 2021-05-30 11:05:45 · 733 阅读 · 0 评论 -
62 spi驱动
一、spi驱动框架1、裸机spi驱动框架首先编写 spi 控制器驱动,bsp_spi.c 和 bsp_spi.h。向外提供读写api:spich0_readwrite_byespi 具体芯片驱动:ICM206082、linux下的 spi 驱动框架主机控制器驱动:soc 的 spi 外设驱动,此驱动是半导体原厂编写好的,为 spi-imx.c当 spi 控制器的设备和驱动匹配以后, spi_imx_probe 函数就会执行,完善 imx6ul 的 spi控制器驱动。spi控制器驱动的核心就是原创 2021-05-29 17:23:29 · 831 阅读 · 1 评论 -
61 iic驱动
一、I2C驱动框架1.1 裸机I2C驱动框架我们编写了四个文件: bsp_i2c.c、bsp_i2c.h、 bsp_ap3216c.c 和 bsp_ap3216c.h。其中前两个是 I.MX6U 的 IIC 接口驱动,后两个文件是 AP3216C 这个 I2C 设备驱动文件。相当于有两部分驱动:I2C 主机驱动 和 I2C 设备驱动。首先编写 iic 控制器驱动:bsp_i2c.c、bsp_i2c.h。向外提供 i2c_master_transfer 函数。然后编写具体的 iic设备驱动:bsp原创 2021-05-27 23:03:36 · 296 阅读 · 0 评论 -
60 rtc 实时时钟驱动
RTC 也就是实时时钟,用于记录当前系统时间1、Linux 内核 RTC 驱动简介RTC 设备驱动是字符设备驱动,需要有 struct file_operation 操作集(成员函数 open,release,read,write 和 ioctl)在linux内核中使用 struct rtc_device 来表示一个 rtc实时时钟。编写linux下的rtc驱动就是申请并初始化 struct rtc_device ,最后将 struct rtc_device 注册到 linux内核 里面。s.原创 2021-05-26 23:09:09 · 250 阅读 · 0 评论 -
59 linux lcd驱动
Framebuffer是一种机制,应用程序操作驱动里面的lcd显存的机制,应用程序通过操作显存在lcd上显示图片信息。通过framebuffer机制将底层的lcd抽象为 /dev/fbX,应用程序可以通过操作 /dev/fbX 来操作屏幕。fb_info 结构体就是framebuffer在内核中的表现形式。屏幕驱动重点就是初始化结构体fb_ino的各个成员。初始化完成以后通过 int register_framebuffer(struct fb_info *fb_info) 向内核注册刚刚初始化好原创 2021-05-22 23:10:24 · 149 阅读 · 0 评论 -
58 input 子系统
一、input子系统简介input子系统也是字符设备,input核心层会帮我们注册input字符设备驱动。内核已经写好了input驱动,但我们去完善具体的输入设备,完善输入设备的时候需要按照input子系统驱动框架的要求来。步骤1、input_dev申请(struct input_dev *input_allocate_device(void))并初始化,最后注册结构体input_dev,其成员变量evbit表示输入事件类型,比如按键对应的事件就是EV_KEY。若要连按,那么还需要注册 EV_RE原创 2021-05-18 23:13:15 · 443 阅读 · 0 评论 -
57 MISC 杂项驱动
MISC驱动#include<linux/module.h>#include<linux/kernel.h>#include<linux/init.h>#include <linux/fs.h>#include<linux/slab.h>#include<linux/io.h>#include<linux/uaccess.h>#include<linux/cdev.h>#include<l原创 2021-05-16 08:55:54 · 380 阅读 · 0 评论 -
56 linux自带的led驱动
一、内核自带的驱动使能1、内核自带的驱动,都是通过图形化界面配置,选择使能或者不使用。2、配置好 Linux 内核以后退出配置界面,打开.config 文件,会找到“CONFIG_LEDS_GPIO=y”。Lin·。ux 会根据 CONFIG_LEDS_GPIO 的值来选择如何编译LED 灯驱动,如果为‘y’就将其编译进 Linux 内核...原创 2021-05-16 08:52:54 · 910 阅读 · 0 评论 -
54 platform设备驱动
设备设备数据类型为 device,通过 device_register 向内核注册设备include/linux/device.h/** * struct device - The basic device structure * @parent: The device's "parent" device, the device to which it is attached. * In most cases, a parent device is some sort of bus or.原创 2021-05-06 23:01:16 · 277 阅读 · 0 评论 -
53 异步通知
硬件中断原创 2021-04-26 22:48:22 · 155 阅读 · 0 评论 -
52 阻塞与非阻塞
一、阻塞io和非阻塞io当资源不可用的时候阻塞式 IO:就会将应用程序对应的线程挂起,直到设备资源可以获取为止。当资源可用的时候唤醒任务 / 线程非阻塞 IO:应用程序对应的线程不会挂起,它要么一直轮询等待,直到设备资源可以使用,要么就直接放弃。一般会有超时处理机制二、等待队列等待队列头驱动源码wait_event#include<linux/module.h>#include<linux/kernel.h>#include<linux/ini原创 2021-04-25 07:25:43 · 251 阅读 · 0 评论 -
51 linux 中断
一、裸机中断和linux中断对比A、裸机中断B、linux中断1、确定要使用的中断对应的中断号(一个int变量)2、申请中断(基于中断号去申请)request_irq,此函数也会激活中断3、使用完中断后需要使用 free_irq 来释放中断4、中断处理函数 irqreturn_t (*irq_handler_t) (int, void *)5、使能和禁止中断上半部和下半部中断处理函数一定要越短越好软中断使用软中断前先使用 open_softirq 函数注册对应的软中断处原创 2021-04-20 23:01:53 · 236 阅读 · 0 评论 -
50 内核定时器
cortex-M 内核使用 systick 作为系统定时器硬件定时器软件定时器,依靠系统定时器来驱动(本文介绍)linux内核频率可以设置,图形化界面配置Hz表示系统节拍率,Hz=100表示系统每秒产生中断100次内核定时器1、软件定时器不同于硬件定时器那样直接给周期指。软件定时器设置的是期满以后的时间点(jiffies + 你需要定时的时间长短)2、定时处理函数3、内核定时器不是周期性的,一次定时时间到了就会关闭,除非重新打开...原创 2021-04-13 22:06:36 · 339 阅读 · 0 评论 -
45 pinctrl子系统 和 gpio子系统
一、6ull 的 gpio 使用步骤1、设置 pin 的 复用 和 电气属性2、配置 gpio 的二、pinctrl子系统借助 pinctrl子系统 来设置一个 pin 的 复用 和 电气属性打开文件 imx6ull.dtsi:// 详见 imx6ull.dtsi 参考手册 176,1542iomuxc: iomuxc@020e0000 { compatible = "fsl,imx6ul-iomuxc"; reg = <0x020e0000 0x4000>;};原创 2021-03-18 01:13:45 · 446 阅读 · 0 评论 -
44 设备树 & led
驱动源码dtsled.c#include<linux/module.h>#include<linux/kernel.h>#include<linux/init.h>#include <linux/fs.h>#include<linux/slab.h>#include<linux/io.h>#include<linux/uaccess.h>#include<linux/cdev.h>#inc原创 2021-03-16 00:36:19 · 190 阅读 · 0 评论 -
43 设备树
一、什么是设备树1、uboot 启动内核用到 zImage、imx6ull-alientek-emmc.dtb。bootz 80800000 - 830000002、设备树就是设备和树3、在单片机驱动里面,w25q64的速度属性都是在 .c 文件中写死的。板级信息都写到 .c 里面会产生大量的 .c 文件。把不同的板子信息以这样的形式都写到内核里显然不现实。因此将板子信息做成独立的格式,文件后缀为 .dts。一个平台会者机器对应一个 .dts。二、DTS、DTB 和 DTC 的关系.dt原创 2021-03-12 00:20:26 · 701 阅读 · 0 评论 -
42 新字符设备驱动
一、新字符设备驱动原理1、以前的缺点使用了register_chrdev 浪费了很多次设备号。而且需要我们手动设置主设备号。2、新的字符设备驱动注册函数 (page 1029,1060)int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name) 直接申请设备号,dev : 申请好的设备号存放在第一个参数里面baseminor : 次设备号起始地址,次函数可以申请一段连续原创 2021-03-03 23:27:10 · 311 阅读 · 1 评论 -
41 led驱动
一、地址映射1、裸机led实验就是操作6ull的寄存器。2、linux驱动开发也可以操作寄存器,但不能直接对寄存器的物理地址进行读写操作。比如寄存器A物理地址为0x01010101,裸机时可以直接对0x01010101这个物理地址进行操作,但在linux下是不行的。因为linux会使能mmu。在linux里面操作的都是虚拟地址,所以需要先得到0x01010101这个物理地址对应的虚拟地址。获得物理地址对应的虚拟地址使用函数 ioremap(cokkie size) 第一个参数是物理地址起始地址原创 2021-02-26 21:41:26 · 157 阅读 · 0 评论 -
40 字符设备驱动开发
linux驱动开发思维1、裸机驱动开发很底层,直接和寄存器打交道,有些mcu会提供库;在linux下开发驱动直接操作寄存器不现实2、根据linux下的各种驱动框架进行开发(按框架的基本要求将io的属性告诉系统,然后linux会提供api函数,我们直接操作这些 api函数就可以了,这就要求自己写的驱动要符合框架的要求)一定要满足框架,也就是各种驱动框架的掌握。3、驱动最终表现就是 /dev/xxx 文件。打开(使能)、关闭、读、写4、现在新的内核支持设备树,.dts 文件,描述板子的设备信息,板子..原创 2021-02-23 23:03:18 · 159 阅读 · 1 评论