
Linux驱动开发
文章平均质量分 74
静能生悟
静生智,定生慧,一勤天下无难事,俭以养德,厚德载物!!
展开
-
WLAN_1
https://blog.youkuaiyun.com/suiyuan19840208/article/details/17055875?utm_source=blogxgwz8转载 2020-11-19 19:19:29 · 622 阅读 · 0 评论 -
WIFI系列协议--802.11ac--增强非常高吞吐量简称VHT--1Gbit
请参考:https://blog.youkuaiyun.com/qq_20677327/article/details/105728861转载 2020-11-04 20:30:09 · 1375 阅读 · 0 评论 -
使用iperf测试终端WiFi模块吞吐量
请参考https://blog.youkuaiyun.com/lyss918/article/details/76073746转载 2020-11-04 19:56:33 · 512 阅读 · 0 评论 -
Realtek WiFi调试命令
参见博客:https://blog.youkuaiyun.com/sky619351517/article/details/86633615转载 2020-11-03 10:56:40 · 1990 阅读 · 0 评论 -
WiFi beacon时槽
请参考博客:https://blog.youkuaiyun.com/weixin_40117614/article/details/90200380转载 2020-10-22 22:54:37 · 3472 阅读 · 0 评论 -
WiFi底层学习(一)iw工具
请参考博客:https://blog.youkuaiyun.com/qq_26602023/article/details/106115823?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~sobaiduend~default-2-106115823.nonecase&utm_term=iw%E5%B7%A5%E5%85%B7%20wifi&spm=1000.2123.3001.4430转载 2020-10-22 21:36:49 · 606 阅读 · 0 评论 -
LCD驱动之接口分析
参考https://blog.youkuaiyun.com/shenlong1356/article/details/103669398转载 2020-09-15 18:16:34 · 291 阅读 · 0 评论 -
SDIO接口WiFi驱动分析
参考http://blog.chinaunix.net/uid-31087949-id-5760669.html转载 2020-09-15 18:15:43 · 672 阅读 · 0 评论 -
USB接口WiFi驱动分析
参考https://www.cnblogs.com/newjiang/p/5891106.html转载 2020-09-15 18:14:36 · 368 阅读 · 0 评论 -
Linux内核及内核编程之二Linux2.6后的内核特点
3.2 Linux 2.6后的内核特点 Linux 2.6相对于Linux 2.4有相当大的改进,主要体现在如下几个方面。 1.新的调度器 Linux 2.6以后版本的Linux内核使用了新的进程调度算法,它在高负载的情况下有极其出色的性能,并且当有很多处理器时也可以很好地扩展。在Linux内核2.6的早期采用了O(1)算法,之后转移到CFS(Completely Fair Sc...原创 2018-05-09 10:22:47 · 1464 阅读 · 0 评论 -
Linux内核及内核编程之三Linux内核的组成部分
3.3 Linux内核的组成3.3.1 Linux内核源代码的目录结构Linux内核源代码包含如下目录。arch:包含和硬件体系结构相关的代码,每种平台占一个相应的目录,如i386、arm、arm64、powerpc、mips等。Linux内核目前已经支持30种左右的体系结构。在arch目录下,存放的是各个平台以及各个平台的芯片对Linux内核进程调度、内存管理、中断等的支持,以及每个具体的SoC...原创 2018-05-09 20:05:41 · 2687 阅读 · 1 评论 -
Linux驱动开发之动态分配设备号(参考内核驱动源代码-标准写法)
一、编写驱动文件#include <linux/init.h> // 所有模块都必须包含的头文件 #include <linux/module.h> // 一些宏定义,例如这里的KERN_INFO#include <linux/fs.h>#include <linux/device.h>#include <linux/cdev.h>#in...原创 2018-05-09 17:05:43 · 968 阅读 · 0 评论 -
第18章 ARM Linux设备树之二(设备树的组成和结构)
18.2.7 GPIO、时钟、pinmux连接除了中断以外,在ARM Linux中时钟、GPIO、pinmux(引脚复用)都可以通过.dts中的节点和属性进行描述。1.GPIO对于GPIO控制器而言,其对应的设备节点需声明gpio-controller属性,并设置#gpio-cells的大小。譬如,对于兼容性为fsl,imx28-pinctrl的pinctrl驱动而言,其GPIO控制器的设备节点类...原创 2018-05-17 09:19:36 · 875 阅读 · 0 评论 -
Linux内核及内核编程之四Linux内核的编译及加载
3.4 Linux内核的编译及加载3.4.1 Linux内核的编译 Linux驱动开发者需要掌握Linux内核的编译方法以为嵌入式系统构建可运行的Linux操作系统映像。在编译内核时,需要配置内核,可以使用下面命令中的一个:#make config(基于文本的最为传统的配置界面,不推荐使用)#make menuconfig(基于文本菜单的配置界面)#make xconfig(要求QT被安装)...原创 2018-05-10 16:47:37 · 1140 阅读 · 0 评论 -
第18章 ARM Linux设备树之三(由设备树引发的BSP和驱动变更)
18.3 由设备树引发的BSP和驱动变更有了设备树后,不再需要大量的板级信息,譬如经常在arch/arm/plat-xxx和arch/arm/mach-xxx中实施如下事情。1.注册platform_device,绑定resource,即内存、IRQ等板级信息通过设备树后,形如:static struct resource xxx_resources[] = { [0] = { ...原创 2018-05-17 10:30:46 · 1340 阅读 · 0 评论 -
第18章 ARM Linux设备树之四(常用的OF API)
18.4 常用的OF API除了前文介绍的of_machine_is_compatible()、of_device_is_compatible()等常用函数以外,在Linux的BSP和驱动代码中,经常会使用到一些Linux中其他设备树的API,这些API通常被冠以of_前缀,实现代码位于内核的drivers/of目录下。这些常用的API包括下面内容。1.寻找节点struct device_node...原创 2018-05-17 11:05:11 · 1617 阅读 · 0 评论 -
Linux内核及内核编程之五Linux下的C编程特点
3.5 Linux下的C编程特点3.5.1 Linux编码风格Linux有独特的编码风格,Linux程序的命名习惯和Windows程序的命名习惯及著名的匈牙利命名法有很大的不同。在Windows程序中,习惯以如下方式命名宏、变量和函数声明:#define PI 3.1415926 /* 用大写字母代表宏 */int minValue, maxValue; /* 变量:第一个单词全小写,其...原创 2018-05-11 16:05:03 · 491 阅读 · 0 评论 -
Linux内核及内核编程之六Linux下的工具链、实验室建设、串口工具
3.6 工具链在Linux的编程中,通常使用GNU工具链编译Bootloader(U-boot)、内核和应用程序。GNU组织维护了GCC、GDB、glibc、Binutils等,分别见于https://gcc.gnu.org/,https://www.gnu.org/software/gdb/,https://www.gnu.org/software/libc/、https://www.gnu.o...原创 2018-05-11 17:18:38 · 1283 阅读 · 0 评论 -
第5章 Linux文件系统与设备文件之一(Linux文件操作)
本章重点字符设备和块设备都体现了“一切都是文件”的设计思想,掌握Linux文件系统、设备文件系统的知识很重要。首先,驱动最终通过与文件操作相关的系统调用或C库函数(本质上也基于系统调用)被访问,而设备驱动的结构最终也是为了提供给应用程序员的API。其次,驱动工程师在设备驱动中会与设备文件系统打交道,包括从Linux 2.4内核的devfs文件系统到Linux 2.6以后的udev。本节通过Linu...原创 2018-05-18 11:04:56 · 1759 阅读 · 0 评论 -
第5章 Linux文件系统与设备文件之二(Linux文件操作C库文件)
5.1.2 C库文件操作C库函数的文件操作独立于具体的操作系统平台,不管是在DOS、Windows、Linux还是在VxWorks中都是这些函数:1.创建和打开FILE *fopen(const char *path, const char *mode);fopen()用于打开指定文件filename,其中的mode为打开模式,C库函数中支持的打开模式如表5.3所示。表5.3 C库函数文件打开标志...原创 2018-05-18 11:33:10 · 325 阅读 · 0 评论 -
第5章 Linux文件系统与设备文件之三(Linux文件系统)
本节讲解Linux文件系统的目录结构,简单介绍Linux内核中文件系统的实现,并给出文件系统与设备驱动的关系。5.2 Linux文件系统5.2.1 Linux文件系统目录结构进入Linux根目录(即“/”,Linux文件系统的入口,也是处于最高一级的目录),运行“ls –l”命令,看到Linux包含以下目录。1./bin包含基本命令,如ls、cp、mkdir等,这个目录中的文件都是可执行的。2./...原创 2018-05-18 15:19:09 · 579 阅读 · 0 评论 -
第5章 Linux文件系统与设备文件之四(设备文件系统devfs和用户空间设备管理udev)
5.3 devfsdevfs(设备文件系统)是由Linux 2.4内核引入的,它的出现使得设备驱动程序能自主地管理自己的设备文件。具体来说,devfs具有如下优点。1)可以通过程序在设备初始化时在/dev目录下创建设备文件,卸载设备时将它删除。2)设备驱动程序可以指定设备名、所有者和权限位,用户空间程序仍可以修改所有者和权限位。3)不再需要为设备驱动程序分配主设备号以及处理次设备号,在程序中可以直...原创 2018-05-18 16:54:55 · 965 阅读 · 0 评论 -
第6章 字符设备驱动之Linux字符设备驱动结构
本章导读在整个Linux设备驱动的学习中,字符设备驱动为基础。本章将讲解Linux字符设备驱动程序的结构,并解释其主要组成部分的编程方法。1、Linux字符设备驱动的关键数据结构cdev及file_operations结构体的操作方法,并分析了Linux字符设备的整体结构,给出了简单的设计模板。2、讲解globalmem的设备驱动编写方法,对读写函数、seek()函数和I/O控制函数等进行重点分析...原创 2018-05-18 17:58:19 · 296 阅读 · 0 评论 -
第6章 字符设备驱动之Linux字符设备驱动结构
6.1.4 Linux字符设备驱动的组成在Linux中,字符设备驱动由如下几个部分组成。1.字符设备驱动模块加载与卸载函数在字符设备驱动模块加载函数中实现设备号的申请和cdev(字符设备)的注册,在卸载函数中实现设备号的释放和cdev的注销。Linux内核的编码习惯是为设备定义一个设备相关的结构体,这个结构体包含设备所涉及的cdev、私有数据及锁等信息。常见的设备结构体、模块加载和卸载函数形式如代...原创 2018-05-19 11:17:13 · 271 阅读 · 0 评论 -
第6章 字符设备驱动之globalmem(全局内存)虚拟设备实例(单个字符设备)
本节概述在globalmem(全局内存)字符设备驱动中会分配一片大小为GLOBALMEM_SIZE(4KB)的内存空间,并在驱动中提供针对该片内存的读写、控制和定位函数,以供用户空间的进程能通过Linux系统调用获取或设置这片内存的内容。1、ioctl()命令Linux内核推荐采用一套统一的ioctl()命令生成方式,Linux建议以如图6.2所示的方式定义ioctl()的命令。命令码的设备类型字...原创 2018-05-19 20:56:00 · 1091 阅读 · 0 评论 -
第6章 字符设备驱动之globalmem(全局内存)虚拟设备实例(支持N个globalmem设备的globalmem驱动)
一、支持N个globalmem设备的驱动,在加载模块后需创建多个设备节点,如运行 mknod /dev/globalmem0 c 230 0使得/dev/globalmem0对应主设备号为globalmem_major、次设备号为0的设备,运行mknod/dev/globalmem1 c 230 1使得/dev/globalmem1对应主设备号为globalmem_major、次设备号为1的设备。...原创 2018-05-19 21:56:03 · 485 阅读 · 0 评论 -
第7章 Linux设备驱动中的并发控制之一(并发与竞态)
本章导读Linux设备驱动中必须解决的一个问题是多个进程对共享资源的并发访问,并发的访问会导致竞态(竞争状态)。Linux提供了多种解决竞态问题的方式,这些方式适合不同的应用场景。7.1讲解了并发和竞态的概念及发生场合。7.2讲解了编译乱序、执行乱序的问题,以及内存屏障。7.3~7.8分别讲解了中断屏蔽、原子操作、自旋锁、信号量和互斥体等并发控制机制。7.1 并发与竞态并发是多个执行单元同时、并行...原创 2018-05-19 23:08:47 · 553 阅读 · 0 评论 -
Linux设备驱动中的并发控制之二(编译乱序和执行乱序)
7.2 编译乱序和执行乱序理解Linux内核的锁机制,需要理解编译器和处理器的特点。如下面一段代码,写的一端申请一个新的struct foo结构体并初始化其中的a、b、c,之后把结构体地址赋值给全局gp指针:struct foo { int a; int b; int c;};struct foo *gp = NULL;/* . . . */p = kmalloc(sizeof(...原创 2018-05-20 12:26:06 · 495 阅读 · 0 评论 -
Linux设备驱动中的并发控制之三(中断屏蔽)
7.3 中断屏蔽在单核CPU范围内避免竞态的方法是在进入临界区之前屏蔽系统的中断,但在驱动编程中不值得推荐,驱动通常需要考虑跨平台特点而不假定自己在单核上运行。CPU一般都具备屏蔽中断和打开中断的功能,这项功能可以保证正在执行的内核执行路径不被中断处理程序所抢占,防止某些竞态条件的发生。具体而言,中断屏蔽将使得中断与进程之间的并发不再发生,而且,由于Linux内核的进程调度等操作都依赖中断来实现,...原创 2018-05-20 13:49:49 · 833 阅读 · 0 评论 -
第四章Linux内核模块之一(内核模块简介)
本章导读Linux设备驱动会以内核模块的形式出现,学会编写Linux内核模块编程是学习Linux设备驱动的先决条件。4.1 Linux内核模块简介Linux内核的整体架构非常庞大,其包含的组件也非常多。怎样把需要的部分都包含在内核中呢?一种方法是把所有需要的功能都编译到Linux内核中。这会导致两个问题,一是生成的内核会很大,二是如果要在现有的内核中新增或删除功能,将不得不重新编译内核。有没有另一...原创 2018-05-14 14:57:54 · 610 阅读 · 0 评论 -
Linux设备驱动中的并发控制之四(原子操作)
7.4 原子操作原子操作指的是在执行过程中不会被别的代码路径所中断的操作。Linux内核提供一系列函数来实现内核中的原子操作,这些函数分为两类,分别针对位和整型变量进行原子操作。位和整型变量的原子操作都依赖于底层CPU的原子操作,因此所有这些函数都与CPU架构密切相关。原子操作主要用于实现资源计数,很多引用计数(refcnt)就是通过原子操作实现的。7.4.1 整型原子操作1.设置原子变量的值vo...原创 2018-05-20 15:47:20 · 496 阅读 · 0 评论 -
Linux并发控制之原子操作Demo(以全局内存虚拟设备为例)
一、驱动源代码头文件#ifndef __GLOBAL_MEM_H#define __GLOBAL_MEM_H#include <linux/cdev.h>#define DRIVER_AUTHOR "xz@vi-chip.com.cn"#define DRIVER_DESC "A sample driver" #define GLOBALMEM_SIZE 0x1000#define...原创 2018-05-20 15:55:53 · 534 阅读 · 2 评论 -
第四章Linux内核模块之二(内核模块程序结构)
4.2 Linux内核模块程序结构一个Linux内核模块主要由如下几个部分组成。(1)模块加载函数当通过insmod或modprobe命令加载内核模块时,模块的加载函数会自动被内核执行,完成本模块的相关初始化工作。(2)模块卸载函数当通过rmmod命令卸载某模块时,模块的卸载函数会自动被内核执行,完成与模块加载函数相反的功能。(3)模块许可证声明许可证(LICENSE)声明描述内核模块的许可权限,...原创 2018-05-14 15:17:24 · 795 阅读 · 0 评论 -
第四章Linux内核模块之三(模块加载函数)
4.3 模块加载函数Linux内核模块加载函数一般以__init标识声明,典型的模块加载函数的形式如代码清单4.2所示。代码清单4.2 内核模块加载函数static int _ _init initialization_function(void){ /* 初始化代码 */ return 0; //初始化成功 } module_init(initialization_function...原创 2018-05-14 16:25:55 · 1299 阅读 · 0 评论 -
第四章Linux内核模块之四(模块卸载函数)
4.4 模块卸载函数Linux内核模块加载函数一般以__exit标识声明,典型的模块卸载函数的形式如代码清单4.3所示。代码清单4.3 内核模块卸载函数 static void _ _exit cleanup_function(void){ /* 释放代码 */ } module_exit(cleanup_function);模块卸载函数在模块卸载的时候执行,而不返回任何值,且必须以“...原创 2018-05-14 16:40:54 · 559 阅读 · 0 评论 -
Linux设备驱动中的并发控制之五(自旋锁)
7.5 自旋锁7.5.1 自旋锁的使用自旋锁(Spin Lock)是一种典型的对临界资源进行互斥访问的手段,名称来源于它的工作方式。为了获得一个自旋锁,在某CPU上运行的代码需先执行一个原子操作,该操作测试并设置(Test-And-Set)某个内存变量。由于它是原子操作,所以在在该操作完成之前其他执行单元不可能访问这个内存变量。如果测试结果表明锁已经空闲,则程序获得这个自旋锁并继续执行;如果测试结...原创 2018-05-20 20:41:54 · 1084 阅读 · 0 评论 -
Linux并发控制之自旋锁(以全局内存虚拟设备为例)
一、自旋锁被用于实现使得设备只能被最多1个进程打开1、头文件#ifndef __GLOBAL_MEM_H#define __GLOBAL_MEM_H#include <linux/cdev.h>#define DRIVER_AUTHOR "xz@vi-chip.com.cn"#define DRIVER_DESC "A sample driver" #define GLOBALME...原创 2018-05-20 21:14:17 · 227 阅读 · 0 评论 -
Linux设备驱动中的并发控制之六(读写自旋锁)
7.5.2 读写自旋锁自旋锁不关心锁定的临界区在进行什么操作,不管是读还是写,都一视同仁。即便多个执行单元同时读取临界资源也会被锁住。对共享资源并发访问时,多个执行单元同时读取它不会有问题,读写自旋锁(rwlock)可允许读的并发。读写自旋锁是一种比自旋锁粒度更小的锁机制,它保留了“自旋”的概念,但在写操作方面,只能最多有1个写进程,在读操作方面,同时可以有多个读执行单元。读和写不能同时进行。读写...原创 2018-05-20 21:55:23 · 1388 阅读 · 0 评论 -
Linux设备驱动中的并发控制之七(顺序锁)
7.5.3 顺序锁顺序锁(seqlock)是对读写锁的一种优化,若使用顺序锁,读执行单元不会被写执行单元阻塞,读执行单元在写执行单元对被顺序锁保护的共享资源进行写操作时仍然可以继续读,而不必等待写执行单元完成写操作,写执行单元也不需要等待所有读执行单元完成读操作才去进行写操作。但是,写执行单元与写执行单元之间仍然是互斥的,即如果有写执行单元在进行写操作,其他写执行单元必须自旋在那里,直到写执行单元...原创 2018-05-20 22:30:08 · 277 阅读 · 0 评论 -
Linux设备驱动中的并发控制总结
总结:并发和竞态广泛存在,中断屏蔽、原子操作、自旋锁和互斥锁都是解决并发问题的机制。中断屏蔽很少单独被使用,原子操作只能针对整数进行,自旋锁和互斥锁应用最为广泛。自旋锁会导致死循环,锁定期间不允许阻塞,因此要求锁定的临界区小。互斥锁允许临界区阻塞,可以适用于临界区大的情况。...原创 2018-05-20 22:45:10 · 254 阅读 · 0 评论