
linux 驱动开发
文章平均质量分 92
晩风与她
这个作者很懒,什么都没留下…
展开
-
设备树——pinctrl和gpio子系统
一、设备树中添加pinctrl节点模板1.1 创建对应的节点打开.dts文件,在iomuxs节点中的板子型号对应的节点中添加pinctrl_test节点。注意前缀必须为pinctrl_pinctrl_test: testgrp{ /*具体的pin信息*/};1.2添加fsl,pins属性设备树是通过属性来保存信息的,对于I.MX系列SoC而言,pinctrl驱动程序是通过读取fsl,pins属性值来获取PIN的配置信息。pinctrl_test: testgrp{ fsl,pi原创 2020-08-28 16:01:38 · 3696 阅读 · 0 评论 -
设备树常用的OF操作函数
设备树常用的OF操作函数1、查找节点的OF函数设备都是以节点的形式挂到设备树上的,因此想要获取这个设备的其他属性信息,必须先获取到这个设备的节点。linux内核使用device_node结构体来描述一个节点,该结构体定义在include/linux/of.h中。定义如下:struct device_node { const char *name; /* 节点名字 */ const char *type; /* 设备类型 */ phandle phandle; const char *f原创 2020-08-27 14:39:24 · 1324 阅读 · 0 评论 -
中断处理之中断上下文、中断上下部和共享中断
中断处理之中断上下文、中断上下部和共享中断1、中断上下部设备的中断会打断内核中进程的正常调度和运行。如上图描述了linux内核中断的处理机制。在中断执行时间尽可能短和中断处理大量工作中找到一个平衡点,linux将中断处理函数分为上部(top half)和下部(botoom half)。上部完成尽可能少的紧急的中断,往往只是简单的寄存器读写操作并触发中断,将需要中断处理的程序放到下部的队列中,等待中断处理。这样一来工作的中心就处于下部,下部来完成中断的绝大多数任务。下部中断处理程序可以被新的中原创 2020-08-25 13:13:29 · 1704 阅读 · 0 评论 -
Linux内存管理之kmalloc、malloc、vmalloc的区别
Linux内存管理之kmalloc、malloc、vmalloc的区别kmalloc和vmalloc分配的是内核空间的内存,malloc分配的是用户空间的内存。kmalloc保证分配的内存在物理上是连续的,内存只有在被DMA(直接存储器访问)访问的时候才需要在物理上连续。vmalloc分配的内存在虚拟地址空间上是连续的。malloc分配的是很多内存片断,不是连续的地址空间。kmalloc分配的内存比较小,malloc和vmalloc分配的内存较大。vmalloc要比kmalloc速度慢。尽管只原创 2020-08-25 11:09:47 · 1659 阅读 · 0 评论 -
ARM 设备树
ARM 设备树的起源设备树是一种描述硬件的数据结构,它起源于OpenFirmware。在linux2.6中,ARM架构的板级硬件细节过多的被硬编码在arch/arm/plat-xxx和arch/arm/mach-xxx中,采用设备树后,很多硬件信息可以直接通过设备树传递给linux,而不需要在内核中进行大量的冗余编码。设备树由一系列被命名的节点(Node)和属性(Property)组成,而节点本身可以包含子节点。所谓属性,其实就是成对出现的名称和值。在设备树中,可描述的信息包括:CPU的数量和类别原创 2020-08-18 16:40:16 · 985 阅读 · 0 评论 -
linux总线设备驱动模型——设备总线device&bus
设备描述linux系统中每个设备由一个struct device描述struct device { ... struct kobject kobj; char bus_id[BUS_ID_SIZE]; //在总线上唯一标识设备的字符串 struct bus_type *bus; //设备所在总线 struct device_driver *driver; //管理该设备的驱动 void *driver_data; //该设备驱动使用的私有数据成员原创 2020-08-18 09:01:45 · 234 阅读 · 0 评论 -
linux总线设备驱动模型——platform总线设备模型
Platform总线Platform总线是linux2.6内核加入的一种虚拟总线。Platform机制由两部分组成:platform_device 和 platform_driver。Platform设备驱动优势platform机制将设备本身的资源注册进内核,由内和统一管理。在驱动程序使用这些资源时使用统一的接口,提高了程序的可移植性。platform_device结构体struct platform_device{ const char *name; //设备名 int id原创 2020-08-13 13:27:04 · 599 阅读 · 0 评论 -
linux总线设备驱动模型——总线bus_basic
设备元素模型总线驱动设备总线总线是处理器和设备之间的通道,在设备模型中,所有的设备都通过总线相连,甚至是内部的虚拟总线platform。在设备模型中,总线由bus_type结构表示,定义在<linux/device.h>中。struct bus_type { const char *name; //总线名字 struct bus_attribute *bus_attrs; //总线属性 struct device_attribute *dev_attrs原创 2020-08-12 14:08:42 · 363 阅读 · 0 评论 -
linux总线设备驱动模型——Kset
Kset/******************************************************************* *Kset是具有相同类型的kobject集合,在sysfs中体现为一个目录, *在内核中用kset数据结构表示。 *******************************************************************/struct kset{ struct list_head list;//连接该kset中所有kobje原创 2020-08-12 10:42:45 · 260 阅读 · 0 评论 -
linux总线设备驱动模型——Kobject
Sysfs文件系统基于RAM将内核的数据结构、数据结构的属性和它们之间的关系展现给用户空间。sysfs把连接在系统上的设备和总线组织成分级的文件,使其可以从用户空间直接访问。Sysfs文件系统挂载于/sys/目录下,它的子目录包括Block,Bus,devices和drivers等。Kobject的作用:创建sys目录下的文件夹实现了基本的面向对象管理机制与Sysfs文件系统紧密相连,在内核中注册的每一个Kobject对象对应/sys/下的一个子目录Kobject结构体内容不需要一原创 2020-08-11 13:38:34 · 298 阅读 · 0 评论 -
字符设备驱动程序(ioctl)——开发步骤(6)
字符设备驱动程序(ioctl)ioctl函数模型int (*ioctl)(struct inode *inode,struct file *filp,unsigned int cmd,unsigned long arg){}返回值:ioctl函数的实现通常是根据命令执行的switch语句,但是命令号不能匹配到任何一个设备时,通常返回-EINVAL(非法参数)使用参数:参数如果是一个整数,可以直接使用,如果是一个指针,需要先确保用户地址的有效性,使用前需要做正确检查需要检测的函数:原创 2020-08-07 17:28:27 · 1575 阅读 · 2 评论 -
字符设备驱动程序(write & read)——开发步骤(5)
运用应用程序调用自己编写的字符设备驱动将字符设备驱动程序make,编译一下导入模块并查看模块sudo insmod memdev.kosudo lsmod创建设备文件memdev0并查看,在/dev目录下cd /devsudo mknod 设备文件名 c(字符设备驱动程序) 主设备号 次设备号查看主设备号cat /proc/devices创建设备文件sudo mknod memdev0 c 241 0编译mem_app.c文件,生成可执行文件a原创 2020-08-06 15:38:53 · 875 阅读 · 1 评论 -
字符设备驱动程序(Demo)——开发步骤(4)
将字符驱动程序进行编译,导入模块1、编写Makefile文件/*************************************************** *外部编译:将内核模块源文件放在内核源码外部进行编译 *动态编译:编译生成动态模块 xxx.ko ***************************************************/进入终端查看当前系统的内核版本号uname -r进入系统modules目录查看cd /lib/modules/4.原创 2020-08-05 14:51:07 · 648 阅读 · 1 评论 -
字符设备驱动程序(Demo源码)——开发步骤(3)
基于模块开发模板#include <linux/init.h>#include <linux/module.h>static int __init demo_init(void){ printk(KERN_INFO "---%s---%s---%d---\n",__FILE__,__func__,__LINE__); return 0;}static void __exit demo_exit(void){ printk(KERN_INFO "---%s---原创 2020-08-05 12:22:19 · 495 阅读 · 1 评论 -
字符设备驱动程序——开发步骤(2)
字符设备驱动程序——开发步骤(2)cdev结构体struct cdev{ struct module *owner; //THIS_MODULE const struct file_operations *ops; //操作方法集 dev_t dev; //设备号 unsigned int count; //设备个数 struct list_head list;}dev_t 设备号用来唯一标识设备的。数据类型:32位无符号整型主设备号(前12位) + 次设原创 2020-08-05 10:42:02 · 256 阅读 · 0 评论 -
字符设备驱动程序——开发步骤(1)
驱动程序?使硬件工作的软件原创 2020-08-04 15:04:33 · 602 阅读 · 0 评论 -
Uboot
uboot 介绍一个嵌入式系统从软件角度分析,可以分为三个层次:1、引导加载程序固化在固件中的bootBootloader2、linux 内核linux kernel3、文件系统系统命令应用程序Bootloader定义Bootloader是在操作系统运行之前运行的一段小程序,通过这段小程序可以初始化硬件设备,从而将系统的软硬件环境带到一个合适的状态,以便为最终的调用操作系统做准备。为什么需要进行bootloader移植?每一种不同的cpu体系结构有不同的bootload原创 2020-08-03 16:54:48 · 219 阅读 · 0 评论 -
Ubuntu 18.04 linux内核(版本4.18.14)编译
linux内核编译===================================================================一、环境说明ubuntu 版本: 18.04linux 内核版本: 4.18.14需要确保内存的空间充足,以免编译到最后内存空间不足导致编译失败二、编译步骤1、 下载linux内核源码前往linux kernel源码官网 ,下载对应版本的内核源代码,这里我选择的是4.18.14版本,下载到ubuntu中。选择HTTP下载链接进入原创 2020-07-31 16:35:36 · 3033 阅读 · 0 评论