![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
嵌入式驱动
文章平均质量分 60
pangyinglong
这个作者很懒,什么都没留下…
展开
-
STM32移植DSP编译出现 “q31_t is no a type name”错误解决
感谢此文--《(172条消息) STM32移植DSP库_mzldxf的博客-CSDN博客》作者在文章最后给我提醒。错误原因:错误原因:DSP头文件arm_math.h中定义的一些类型和core_cm7.h版本不符合解决方法:使用Keil软件安装中自带的头文件替代现有工程的头文件(这些文件是底层代码头文件,不用修改)...原创 2021-10-29 17:01:37 · 1182 阅读 · 0 评论 -
STM32H743基于HAL库实现串口中断发送+DMA空闲中断接收
输出:system.out对象输入:system.inscanner接收控制台输入;Scanner(system.in);使用nextInt();nextDouble();单目+ -、赋值:右到左原创 2021-07-15 16:07:00 · 4350 阅读 · 3 评论 -
对V4L2框架理解与经典知识积累
v4l2_device:使用v4l2协议的设备总的管理结构体video_device:针对于一类用了v4l2协议的摄像头设备v4l2_subdevice:处于video_device之下,对应于一种设备,用于摄像头与控制器间的通信,实现对摄像头的控制。v4l2_subdevice的一些接口可以提供给video_device接口调用,video_deivce的接口提供给cdev字符设...原创 2019-11-01 23:23:08 · 217 阅读 · 0 评论 -
Linux设备驱动程序中创建线程的方法
参考博客文章来源:https://blog.csdn.net/ezimu/article/details/60467017第一种方法:kernel_thread#include <linux/sched.h>extern pid_t kernel_thread(int (*fn)(void *), void *arg, unsigned long flags);(1)...原创 2019-10-20 12:40:31 · 2868 阅读 · 1 评论 -
request_module("fb%d", fbidx);
在 Linux 2.6 内核中,可使用 request_module(const char *fmt,…)函数加载内核模块,驱动开发人员可通过调用request_module(module_name);如:request_module("fb%d", fbidx);来加载其他内核模块。fbidx是%d的参数。是子设备号。在什么时候使用这个函数呢?驱动设备子系统中,以一个主设备管理所...原创 2019-08-08 23:06:08 · 1330 阅读 · 0 评论 -
设备驱动程序中由主设备号和次设备号组成的设备子系统
前言:一个字符设备驱动程序对应一组设备驱动程序的操作函数file_operations,但是一个设备可以有多个次设备,由次设备号代表。主设备号(高12位)和次设备号(低20位)组成的设备号指向一个具体的设备,该设备在内核中用一个结构体表示,里面保存自身特有的数据内容,打开设备文件时,在驱动的操作函数里面根据次设备号找到描述链表中的结构体。在结构体链表中,保存了在probe中初始化好的该设...原创 2019-11-01 23:14:06 · 619 阅读 · 0 评论 -
seq_file对proc文件的顺序读写
在用户空间为了获取设备驱动程序的信息,内核提供了proc文件的方法,在驱动程序中创建一个proc文件,在读写时,通过seq_file的操作函数访问设备驱动程序的内部数据,写入或者读取数据。在内核的seq_file.txt文档下,明确地讲解了该方法的使用。全文如下:包括了各个函数功能,有哪些函数可以实现该功能,具体的函数调用顺序以及哪些函数需要编程者实际填充实现。The seq_fil...原创 2019-08-06 15:08:41 · 363 阅读 · 0 评论 -
I/O内存
IO内存:当外部寄存器或内存映射到内存空间时,即使用访问内存的方式对外部寄存器或者内存进行读写操作。比如配置外设控制器的寄存器,该寄存器是挂载在地址总线上的。I/O内存分配和映射——以上内容来自《LDD3》相关的accessor函数 IO内存读函数: unsigned int ioread8(void *addr); unsigned int io...原创 2019-08-08 12:58:46 · 288 阅读 · 0 评论 -
DM9000网卡设备驱动程序中数据发送过程分析
在Linux内核中,内核为支持的网络设备提供了一套公共接口,使用该接口可以管理一个网卡设备,编写驱动程序时不需要考虑网络数据传输的协议,对数据的解析和包装皆由协议层处理,驱动程序实现底层的硬件操作接口,提供给上层调用(发送数据过程),接收数据过程在中断函数中用硬件操作(寄存器读写)的方式读网卡芯片里面的数据,提交给上层后,内核就会自动处理好,发送给应用程序。数据发送过程:以DM9000网卡为例...原创 2019-07-30 11:32:22 · 470 阅读 · 0 评论 -
延迟工作队列 struct delayed_work
工作队列的作用:工作队列的作用就是把工作推后,交由一个内核线程去执行,更直接的说就是如果写了一个函数,现在不想马上执行它,想在将来某个时刻去执行它,就可以用工作队列.虽然中断也是这样,需要提供一个中断服务函数,在发生中断的时候去执行,但是和中断相比,工作队列最大的好处就是可以调度可以睡眠,灵活性更好。所以工作队列就是把一些操作放入一个地方,在需要的时候调用。1、一般的工作队列stru...原创 2019-07-29 16:31:57 · 2686 阅读 · 1 评论 -
mmap驱动程序接口函数编写
1、mmap分析内存映射。对于驱动程序来说,内存映射可以提供给用户程序直接访问设备内存的能力。字符设备驱动程序提供了一个mmap接口,可以把内核空间中的那片内存所对应的物理地址空间再次映射到用户空间,这样一个物理内存就有了两份映射,或者说有两个虚拟地址,一个在内核空间,一个在用户空间。这样就可以通过直接操作用户空间的这片映射之后的内存来直接访问物理内存,提高数据传输效率。(借用网络上的图)...原创 2019-07-16 21:24:19 · 430 阅读 · 0 评论 -
Ubuntu中安装配置NFS
开发板与电脑通过nfs连接的示意图: 1、安装NFS Serversudo apt-get install nfs-kernel-server 2、使用mkdir创建一个分享的文件夹,这里起名为share 3、配置NFS Server,nfs的配置在/etc/...原创 2019-07-11 00:01:34 · 231 阅读 · 0 评论 -
device_create_file与device_create
1、device_createdevice_create( my_class, NULL, MKDEV(hello_major, 0), "hello" "%d", 0 );如果成功,它将会在/dev目录下产生/dev/hello0设备官方说明:/** * device_create - creates a device and registers it with sysfs ...原创 2019-08-06 17:07:02 · 1032 阅读 · 0 评论 -
Linux下DMA的分配与映射——基于Linux页管理内存分析
关于DMA的基础知识有空的时候在详细总结一下。前提:Linux内核中对内存的管理是以页为单位进行的,所以分配内存是以页为单位,起始地址都是页的开始地址。现在记录关于DMA的一些内存大小,地址问题的解决,下面问题的分析在普通内存分配和映射也是有效的。上面的图展示的是同一个内存地址空间映射到用户进程空间和内核空间,映射的范围不同。看到系统物理地址上面的地址数据,0x8eb60000...原创 2019-08-08 20:47:30 · 1030 阅读 · 0 评论 -
驱动模块的编译管理Makefile文件
内容还不完整。。。。1、X86PC机下的Makefileobj-m := hello.oKERNEL_DIR := /lib/modules/$(shell uname -r)/buildPWD := $(shell pwd)all: make -C $(KERNEL_DIR) SUBDIRS=$(PWD) modulesclean: rm *.o *.ko *.mod.c...原创 2019-08-08 21:02:21 · 203 阅读 · 0 评论 -
try_module_get与module_put
try_module_get:功能:判断module模块是否处于活动状态,然后通过local_inc()宏将该模块的引用计数加1static inline int try_module_get(struct module *module){ int ret = 1; if (module) { unsigned int cpu = get_cpu();...原创 2019-08-08 23:12:29 · 509 阅读 · 0 评论 -
PAGE_ALIGN页对齐宏总结
len = PAGE_ALIGN((start & ~PAGE_MASK) + info->fix.smem_len);#define PAGE_ALIGN(addr) ALIGN(addr, PAGE_SIZE)#define ALIGN(x, a) (((x) + (a) - 1) & ~((a) - 1))上面的宏逐步展开,就是((...原创 2019-08-07 16:09:18 · 1100 阅读 · 0 评论 -
基于帧缓冲设备学习Linux的notify机制
情景:如果某一时刻完成一个操作,而该操作应该引起一个附加的操作,实现相应的功能。 事件A,附加操作B。当A完成,B就要被调用。 目前,在内核中附加操作B的存在形式是以链表的形式存在,每个操作为链表的一项。要调用就会遍历整个链表,全部执行挂载在链表的操作B(回调函数)概括:notify机制 (通知链)通知链技术可以概括为:事件的被通知者将事件发生时应该执行的操作通过函数指针方式保存...原创 2019-08-07 17:28:41 · 787 阅读 · 0 评论 -
帧缓冲FrameBuffer设备驱动程序分析总结
前言: 图1、FramerBuffer的简单层次图 ...原创 2019-08-07 19:48:58 · 1197 阅读 · 0 评论 -
Linux驱动开发——EXPORT_SYMBOL的使用
参考文章:https://blog.csdn.net/lu_embedded/article/details/51440817涉及两部分:1、导出函数符号的*.c函数2、使用导出函数的*.c文件二者连接的文件是Module.symvers文件两种手段使二者联系起来:复制Module.symvers到使用该导出符号的文件中,后者在文件的Makefile中加入KBUILD_E...原创 2019-08-15 01:10:28 · 373 阅读 · 0 评论 -
notify通知编程+export_symbols建立输出符号
前言:Linux内核中的notify通知机制,类似于QT中的事件通知机制,在需要的时刻发送信号,就会引发对应的处理函数执行。Linux内核中的notify提供了核心层,建立通信机制只需使用核心的接口函数实现。对于该机制的实现原理,编写驱动程序不需要过多分析,通过分析,最终这个机制执行过程最终涉及到内嵌汇编代码。为驱动程序建立一个notify分五步进行:1、初始化一个notify机制的...原创 2019-08-15 10:36:18 · 234 阅读 · 0 评论 -
建立设备属性文件(device_create_file)
1. 涉及的内容1) int device_create_file(struct device *, struct device_attribute *); 在/sys/devices/xxx/目录下创建device属性文件2) void device_remove_file(struct device *, struct device_attribute *);移除/sys/dev...原创 2019-07-10 01:53:23 · 2437 阅读 · 0 评论 -
Linux输入子系统分析
1、LInux事件输入子系统包括三个层次:事件处理层(input_handler)、核心层(input core)、驱动层(inout driver)。事件处理层:负责于用户程序打交道,将硬件驱动层传来的事件报告给用户程序(实际上就是提供了对应的文件操作函数接口给用户程序)。内核中出现时间=用户打开设备几点文件,在驱动的open函数中找到对应的结构体。核心层(core):链接事件处理层和驱...原创 2019-07-10 00:03:05 · 224 阅读 · 0 评论 -
I2C总线adapter驱动及设备client驱动分析总结
设备驱动层:专门针对连接在芯片外部硬件设备而写的代码,IIC总线上可以连接多个硬件设备,与设备驱动一一对应。在应用程序中打开设备驱动程序,就可以操作相关的硬件设备。所以对硬件设备的操作的功能(算法)在这里实现,比如对AT24C08这个EEPROM设备进行所需要的读写方式实现。实现I2C设备client的两种方法(我认为第二种比较好,因为client在加载驱动时自动生成,减少了在attach_a...原创 2019-06-13 01:30:46 · 1467 阅读 · 0 评论 -
解决了一直以来困扰的问题——基于内核提供的pwm驱动框架申请pwm设备失败(提示没有相应的文档或文件-NOENT)
pwm驱动框架提供的函数有:structpwm_device;/**pwm_request-requestaPWMdevice*/structpwm_device*pwm_request(intpwm_id,constchar*label);/**pwm_free-freeaPWMdevice*/...原创 2019-06-13 02:23:07 · 2262 阅读 · 0 评论 -
基于内核提供的pwm驱动器驱动编写pwm的字符设备驱动程序——收获
1、遇到权限问题:insmod: cannot insert 'learn_pwm.ko': Operation not permitted解决方法:这次遇到这个问题是因为在模块入口函数里面出现问题后,没有及时清掉已经获得的内容。教训:在驱动的入口模块函数里面,要注意内容申请的顺序,在判断错误的地方按顺序移除已经分配的内容,alloc_chrdev_region函数在入口函数和出口函数中都...原创 2019-06-01 00:16:27 · 367 阅读 · 0 评论 -
嵌入式设备驱动——自动创建设备节点
//主要用到的四个方法在linux/device.h定义: //创建类和释放类的函数 创建成后将创建/sys/class/name文件夹extern struct class *class_create(struct module *owner, const char *name);extern void class_destroy(struct class *cls);...原创 2019-05-31 21:56:56 · 337 阅读 · 0 评论 -
嵌入式驱动——模块编程形式之模块传递参数
一、使用模块传递参数的原因:安装同一个模块时给模块指定不同的功能特性,给模块传递参数可以实现不同功能选择。二、配备的条件:Linux kernel提供了一个简单的框架,其允许驱动程序声明参数,并且用户在系统启动或模块加载时为参数指定相应值。三、特点:在驱动程序里,参数的用法如同全局变量。四、需包含头文件:#include <Linux/moduleparam...原创 2019-05-13 13:01:23 · 421 阅读 · 0 评论 -
字符设备驱动自动生成设备节点文件
mdev的介绍及使用方法mdev是busybox中一个udev管理程序的精简版,它也可以实现设备节点的自动创建和设备的自动挂载,只是在实现的过程中有点差异。在发生热拔插的时候,mdev被hotplug直接调用,这时mdev通过环境变量中的ACTION和DEVPATH来确定此次热拔插事件的动作及影响了/sys中的哪个目录。接着会看这个目录中是否有“dev”属性的文件,利用这些信息为这个设备在/d...原创 2019-05-11 17:42:41 · 720 阅读 · 0 评论 -
release 接口函数
release接口函数属于file_operation内部函数的一部分,其原型如下int (*release) (struct inode *, struct file *);功能:(1)释放open分配的filp->private_data中的任何内容 (2)在最后的close关闭设备release接口函数框架int first_chrdev_c...原创 2019-05-11 15:51:39 · 2263 阅读 · 0 评论 -
llseek接口函数实现
llseek接口函数属于驱动file_operation结构体内部函数的一部分。llseek函数实现的目的:为了使用用户空间的llseek()系统调用这个函数功能来移动设备的文件指针,然后读/写接口就可以对移动后的位置进行读取功能,而不是每次读/写都只能从0开始一次读取全部数据。综上所述:llsee函数在驱动和应用程序都存在(即用户空间和内核空间都存在),应用程序调用llseek函数就会在...原创 2019-05-11 15:41:47 · 3074 阅读 · 0 评论 -
ioctl设备操作
目的:为了处理非数据的操作。1、用户函数原型:int ioctl(int d,int request,.....);d是操作文件描述符;request代表不同操作的数字值;.....是C语言的实参个数可变的函数原型声明形式,可是这里表示可有可无的参数。第三个形参为unsigned long 类型,除了可以传递数值,还可以传递指针这样用户空间与内核空间就可以交互任意多个字节。...原创 2019-04-12 00:19:39 · 522 阅读 · 0 评论 -
platform虚拟平台总线驱动分析总结
一、platform的两大重要结构体:struct platform_device { const char * name; int id; struct device dev; u32 num_resources; struct resource * resource; struct platform_device_id *id_entry; /* arch sp...原创 2019-06-08 22:41:13 · 711 阅读 · 0 评论 -
对kmalloc、kzalloc、vmalloc三个内存分配函数的理解
kmalloc、kzalloc、vmalloc都是用于驱动程序中获取指定大小可用内存的函数,我们都知道内核不能直接使用内存地址访问内存。内核运行的地址(虚拟地址)比内存大,某些虚拟地址地址经过映射后对应内存地址,内核运行在虚拟地址状态。这样,对虚拟地址的访问,就变成对与虚拟地址有映射关系的内存地址的访问(物理内存地址)。对kmalloc、kzalloc、vmalloc的解释参考:https:/...原创 2019-06-19 21:37:33 · 1390 阅读 · 1 评论 -
对MODULE_DEVICE_TABLE宏的理解
MODULE_DEVICE_TABLE在/linux/module.h文件下面定义,其展开形式为:#define MODULE_DEVICE_TABLE(type, name) \ extern const struct type##_device_id __mod_##type##__##name##_device_table \ __attribute__ ((unuse...原创 2019-07-08 11:52:16 · 2457 阅读 · 0 评论 -
对platform_driver_probe理解
/** * platform_driver_probe - register driver for non-hotpluggable device * @drv: platform driver structure * @probe: the driver probe routine, probably from an __init section * * Use this inste...原创 2019-06-16 22:19:13 · 2507 阅读 · 0 评论 -
gcc编译器__attribute__ 机制
__attribute__ 机制与链接脚本有关对于函数而言,__attribute__用于把函数放进相关的数据段,使用*_start 与*_end调用之间的函数进行函数的逐个调用(放进来的函数不能有形参)使用位置在分号;的前面例子:#define __define_initcall(level,fn,id) \ static initcall_t __initcall_##fn#...原创 2019-06-16 21:02:37 · 564 阅读 · 0 评论 -
(转)Linux嵌入式串口驱动的分析
第一步:串口设备资源结构体的初始化(大部分为全局变量),可以理解为内核代码中已经存在对串口硬件描写的结构体,需要按照设计的框架实现(具体实现过程不需要初学者操心,只要明白整个过程的原理就可以,以后接触的时间长了就会懂的)https://blog.csdn.net/lizuobin2/article/details/51773305第二步:实现驱动部分,完成到硬件的连接(设计到平台总线模型,...转载 2019-06-16 20:48:20 · 435 阅读 · 0 评论 -
注册一个i2c设备时发生的一个错误(s3c-i2c s3c2440-i2c.1: cannot get bus (error -110))
错误提示:s3c-i2c s3c2440-i2c.1: cannot get bus (error -110)来源:kernel/drivers/i2c/busses/i2c-s3c2410.c: ret = s3c24xx_i2c_set_master(i2c); if (ret != 0) { dev_err(i2...原创 2019-06-10 15:59:46 · 2793 阅读 · 2 评论 -
I2C设备构造的四种方法
下载Linux内核的网址:https://mirrors.edge.kernel.org/pub/linux/kernel/v2.6/linux里面的i2c总线分为i2c总线驱动层,i2c核心层,i2c设备驱动层。核心层提供了注册函数接口以及相关的操作函数。编写一个设备的驱动,需要关注的是设备驱动层的内容,涉及到核心层提供函数的使用以及分析。挂接在i2c总线上的设备在内核中用一个...原创 2019-06-10 15:50:56 · 2066 阅读 · 0 评论