
linux设备驱动
文章平均质量分 90
viewsky11
这个作者很懒,什么都没留下…
展开
-
linux power_supply
内核提供给电池驱动的接口就是结构体power_supply。Battery驱动程序需要通过sys文件系统向用户空间提供接口,sys文件系统的路径是由上层的程序指定的。Linux标准的Power Supply驱动程序所使用的文件系统路径问/sys/class/power_supply,其中的每个子目录表示一种能源供应设备的名称。Power Supply驱动程序的头文件在include/linux/po原创 2017-05-25 12:15:57 · 2750 阅读 · 0 评论 -
mac80211解析四
mac80211中创建station由用户空间通过nl80211发起,首先要分配sta_info对象空间,sta_info的定义如下: /** * struct sta_info - STA information * * This structure collects information about a station that * mac80211 is communicating原创 2017-02-20 23:58:15 · 2570 阅读 · 0 评论 -
mac80211解析三
在ieee80211_register_hw函数中,实现了无线网络设备的的注册,网络接口的注册和建立主要由ieee80211_if_add 函数来完成,即:result = ieee80211_if_add(local, "wlan%d", NULL, NL80211_IFTYPE_STATION, NULL); 一般注册生成wlan0,函数ieee80211_原创 2017-02-20 23:08:55 · 3632 阅读 · 0 评论 -
linux电源管理架构
linux电源管理非常复杂,牵扯到系统机的待机、频率电压变换、系统空闲时间的处理以及每个设备驱动对系统待机的支持和每个设备的运行时runtime电源管理,可以说它和系统中的每个设备驱动都息息相关。linux内核电源管理的整体架构, 1)CPU在运行时根据系统负载进行动态电压和频率变换的CPUFreq 2) CPU在系统空闲时根据空闲的情况进行低功耗模式的CPUIdle 3)多核系统内下原创 2017-01-21 23:01:42 · 3147 阅读 · 0 评论 -
模拟网络驱动snull
snull.h文件/* * snull.h -- definitions for the network module * * Copyright (C) 2001 Alessandro Rubini and Jonathan Corbet * Copyright (C) 2001 O'Reilly & Associates * * The source code in this fil原创 2017-02-28 23:45:19 · 654 阅读 · 0 评论 -
rt2860v2源码分析一
git出源码: https://github.com/wuqiong/rt2860v2-for-openwrt-mt7620再rt2860v2中搜索字符串__init, 找到驱动模块的入口函数:os/linux/rbus_main_dev.c:37:int __init rt2880_module_init(VOID);os/linux/pci_main_dev.c:46:static int原创 2016-11-09 22:28:27 · 4002 阅读 · 0 评论 -
linux中的regulator
Regulator模块用于控制系统中某些设备的电压/电流供应。在嵌入式系统(尤其是手机)中,控制耗电量很重要,直接影响到电池的续航时间。所以,如果系统中某一个模块暂时不需要使用,就可以通过regulator关闭其电源供应;或者降低提供给该模块的电压、电流大小。regulator常用概念Regulator : 电源芯片, 比如电压转换芯片 Consumer : 消费者,使用电源的部件, Regul原创 2017-01-20 00:41:23 · 1747 阅读 · 0 评论 -
设备驱动中的pci(kernel-4.7)
PCI 总线架构主要被分成三部分: 1.PCI 设备。 符合 PCI 总线标准的设备就被称为 PCI 设备,PCI 总线架构中可以包含多个 PCI 设备。Audio 、LAN 都是一个 PCI 设备。PCI 设备同时也分为主设备和目标设备两种,主设备是一次访问操作的发起者,而目标设备则是被访问者。2.PCI 总线。 PCI 总线在系统中可以有多条,类似于树状结构进行扩展,每条 P原创 2017-01-19 23:45:35 · 2027 阅读 · 0 评论 -
linux网络设备驱动
网络设备驱动架构Linux网络设备驱动程序的体系结构,依次为网络协议接口层,网络设备接口层,提供实际功能的设备驱动功能层以及网络设备与媒介层。 网络协议接口层向网络层协议提供统一的数据包收发接口,不论上层协议是ARP,还是IP,都通过dev_queue_xmit()函数发送数据,并通过netif_rx()函数接受数据。 网络设备接口层向协议接口层提供统一的用于描述具体网络属性和操作的结构体net原创 2017-02-08 21:44:18 · 1923 阅读 · 0 评论 -
mac80211解析一
解析mac80211从ieee80211_alloc_hw函数分配 和ieee80211_register_hw 函数注册开始。以pci无线网络设备为例,底层pci实现连接并注册pci设备之后,开始在ieee80211_alloc_hw函数中实现无线网络设备的一些列初始化和设备分配,并关联ieee80211_ops操作函数,实现mac层的操作。struct ieee80211_hw *ieee802原创 2017-02-16 23:30:27 · 5573 阅读 · 1 评论 -
mac80211解析五
mac80211驱动会使用到cfg80211模块,分析cfg80211,初始化模块如下: static int __init cfg80211_init(void){ int err; err = register_pernet_device(&cfg80211_pernet_ops); if (err) goto out_fail_pernet; er原创 2017-02-22 00:09:41 · 3931 阅读 · 1 评论 -
mac80211解析六
mac80211的扫描请求由用户空间通过nl80211发起,调用了mac80211中的ieee80211_scan,该函数内容如下:static int ieee80211_scan(struct wiphy *wiphy, struct cfg80211_scan_request *req){ struct ieee80211_sub_if_data *sd原创 2017-02-22 23:24:55 · 2899 阅读 · 0 评论 -
linux设备驱动中的completion(kernel-4.7)
completion定义定义的目录:include/linux/completion.h/* * struct completion - structure used to maintain state for a "completion" * * This is the opaque structure used to maintain the state for a "completio原创 2017-02-23 00:42:21 · 4795 阅读 · 0 评论 -
linux 中断线程化
为什么要进行中断线程化? 在 Linux 中,中断具有最高的优先级。不论在任何时刻,只要产生中断事件,内核将立即执行相应的中断处理程序,等到所有挂起的中断和软中断处理完毕后才能执行正常的任务,因此有可能造成实时任务得不到及时的处理。中断线程化之后,中断将作为内核线程运行而且被赋予不同的实时优先级,实时任务可以有比中断线程更高的优先级。这样,具有最高优先级的实时任务就能得到优先处理,即使在严重负载下原创 2017-05-27 12:24:01 · 7224 阅读 · 0 评论 -
linux work queue
工作队列(work queue)是Linux kernel中将工作推后执行的一种机制。这种机制和BH或Tasklets不同之处在于工作队列是把推后的工作交由一个内核线程去执行,因此工作队列的优势就在于它允许重新调度甚至睡眠。 每个工作队列有一个专门的线程,所有来自运行队列的任 务在进程的上下文中运行(这样它们可以休眠)。驱动程序可以创建并使用它们自己的工作队列,或者使用内核的一个工作队列。 工作原创 2017-05-26 15:38:45 · 497 阅读 · 0 评论 -
rt2860v2源码分析三
在rt2860_probe函数中调用了RtmpPhyNetDevInit为无线网络设备进行初始化,实质是分配建立了pNetDevHook结构体:PNET_DEV RtmpPhyNetDevInit( IN VOID *pAd, IN RTMP_OS_NETDEV_OP_HOOK *pNetDevHook){ struct net_原创 2017-02-26 23:53:07 · 2725 阅读 · 0 评论 -
rt2860v2源码解析四
在pci设备的probe函数rt2860_probe中,有获取设备的初始化操作: /* get DRIVER operations */RTMP_DRV_OPS_FUNCTION(pRtmpDrvOps, NULL, &PciConfig, NULL);RTMP_DRV_OPS_FUNCTION函数调用了RtmpDrvOpsInit函数进行驱动设备操作的初始化,内容如下: VOID RtmpD原创 2017-03-05 22:14:41 · 2606 阅读 · 0 评论 -
mac80211解析七
mac80211的模块初始化的时候,也初始化了minstrel,minstrel是调用速率控制函数模快,通过tx.c中的ieee80211_tx_h_rate_ctrl句柄填充结构体ieee80211_tx_info的速率变量ieee80211_tx_rate。模块初始化后调用了ieee80211_rate_control_register进行速率控制注册,注册了定义好的速率控制操作结构体mac80原创 2017-02-24 17:22:24 · 3328 阅读 · 1 评论 -
mac80211解析二
在实现无线网络设备分配时,ieee80211_register_hw关联了ieee80211_ops结构体:ieee80211_ops结构体是mac80211到设备驱动的回调操作函数集合,定义如下:/** * struct ieee80211_ops - callbacks from mac80211 to the driver * * This structure contains vari原创 2017-02-17 14:18:33 · 3762 阅读 · 0 评论 -
wireless-tools源码分析-iwpriv
iwpriv是Wireless Extensions 操作的特定驱动。通过iwpriv,可以得到AP的一些参数设置,也可以设置自己的WIFI参数。[root@root- /]#iwprivwlan0 Available private ioctls : extscan (8BFA) : set 0 int & get 2 char ho原创 2017-02-24 12:19:25 · 6194 阅读 · 0 评论 -
qcacld-2.0的wlan分析
qcacld-2.0是Qualcomm WLAN Driver。 分析开放的驱动代码: https://github.com/myrom/opensource_wlan_qcacld-2.0.git git得到源码。 根据__init找到入口文件opensource_wlan_qcacld-2.0/CORE/HDD/src/wlan_hdd_main.c static int __init原创 2017-02-07 17:34:34 · 8146 阅读 · 0 评论 -
设备驱动中的mmc(kernel-4.7)
MMC的体系结构,其分为三层 /dev下设备文件访问MMC/SD/SDIO用户空间 |--------------------|-----------------------------------------------------内核空间 \ / MMC Card层(对应具体的设备驱动,如MMC/SD卡块设备驱原创 2017-01-16 23:09:18 · 1729 阅读 · 0 评论 -
android usb gadget分析
Android USB驱动中,上层应用协议里最重要的一个文件是android/kernel/drivers/usb/gadget/android.c。这个文件实现USB的上层应用协议。 首先包含了一些系统级别的头文件,如模块、电源管理、of API等 #include <linux/init.h>#include <linux/module.h>#include <linux/fs.h>#原创 2017-01-10 23:51:39 · 6303 阅读 · 0 评论 -
设备驱动中的regmap
regmap 机制是在 Linux 3.1 加入进来的特性。主要目的是减少慢速 I/O 驱动上的重复逻辑,提供一种通用的接口来操作底层硬件上的寄存器。其实这就是内核做的一次重构。regmap 除了能做到统一的 I/O 接口,还可以在驱动和硬件 IC 之间做一层缓存,从而能减少底层 I/O 的操作次数。 以一个 I2C 设备为例。读写一个寄存器,肯定需要用到i2c_transfer这样的 I2C 函数原创 2017-01-09 23:31:38 · 9187 阅读 · 0 评论 -
设备驱动中的bus(kernel-4.7)
Linux设备驱动模型中的bus,即可以是物理总线(如PCI、I2C总线)的抽象,也可以是出于设备驱动模型架构需要而定义的虚拟的“platform”总线。一个符合Linux设备驱动模型的device或device_driver必须挂靠在一个bus上,无论这个bus是物理的还是虚拟的。 Linux内核使用bus_type结构体来描述bus,该结构体定义在include/linux/device.h文件原创 2016-12-07 21:20:32 · 1083 阅读 · 0 评论 -
设备驱动中的device_driver(kernel-4.7)
device_driver结构体定义在driver/base/base.h中,如下: /** * struct device_driver - The basic device driver structure * @name: Name of the device driver. * @bus: The bus which the device of this driver be原创 2016-12-07 18:56:36 · 2085 阅读 · 0 评论 -
设备驱动中的device(kernel-4.7)
device结构体定义,在kernel-4.7/include/linux/device.h中: /** * struct device - The basic device structure * @driver_data: Private pointer for driver specific info. * @power: For device power management.原创 2016-12-07 15:43:06 · 1089 阅读 · 0 评论 -
解析gpio-keys(kernel-4.7)
kernel中的gpio-keys,在input子系统一个重要的功用,可以对gpio口进行input 按键操作,虽然简单,牵连驱动设备的范围,广度却很大,值得详细探讨。 platform设备注册: static int __init gpio_keys_init(void){ return platform_driver_register(&gpio_keys_device_dri原创 2016-12-06 18:17:06 · 3774 阅读 · 0 评论 -
设备驱动中的pinctrl(kernel-4.7)
在查看kernel源码时,很容易忽略大量的英文注释,其实,英文注解很好的提示代码的功用,所以,网上没有好的参考资料,可以参考英文注释来分析。 下面是driver/pinctrl/core.h中关于pinctrl的重要结构体定义: /** * struct pinctrl_dev - pin control class device * @node: node to include th原创 2016-12-12 21:47:16 · 1085 阅读 · 0 评论 -
设备驱动中的platform(kernel-4.7)
platform驱动模型搭建platform核心层:为设备层和驱动层提供注册接口、为设备层和驱动层的匹配提供标准。 内核是这样描述它们的(Documentation/driver-model/platform.txt):Platform devices are devices that typically appear as autonomousentities in the system. T原创 2016-12-12 21:45:42 · 1900 阅读 · 0 评论 -
Android系统典型bootloader分析
1、bootloader是什么? 简单地说,bootloader 就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。 Android系统基于Linux,所以bootloader部分也是与传统的嵌入式设备上运行的Linux没有什么区别。由于除Google外转载 2016-11-15 21:26:04 · 2173 阅读 · 0 评论 -
linux网络设备理解
网络层次linux网络设备驱动与字符设备和块设备有很大的不同。 1. 字符设备和块设备对应/dev下的一个设备文件。而网络设备不存在这样的设备文件。网络设备使用套接字socket访问,虽然也使用read,write系统调用,但这些调用只作用于软件对象。 2. 块设备只响应来自内核的请求,而网络驱动程序异步接收来自外部世界的数据包,并向内核请求发送到内核。linux内核中网络子系统的设计基于设备无原创 2016-11-15 21:16:39 · 2493 阅读 · 0 评论 -
Linux发送函数dev_queue_xmit
当上层准备好一个包之后,交给下面这个函数处理: int dev_queue_xmit(struct sk_buff *skb) { struct net_device *dev = skb->dev; struct netdev_queue *txq; struct Qdisc *q; int rc = -ENOME转载 2016-11-15 17:20:12 · 2296 阅读 · 0 评论 -
设备驱动中的kobject(kernel-4.7)
kobject是Linux设备模型的最底层数据结构,它代表一个内核对象。 kobject结构体定义在include/linux/kobject.h文件中: struct kobject { const char *name; //这个内核对象的名字,在sysfs文件系统中,name将以一个目录的形式出现 struct list_head entry; //用于将该原创 2016-12-08 14:35:41 · 1046 阅读 · 0 评论 -
linux驱动开发总结(一)
基础性总结1, linux驱动一般分为3大类: * 字符设备 * 块设备 * 网络设备2, 开发环境构建: * 交叉工具链构建 * NFS和tftp服务器安装3, 驱动开发中设计到的硬件: * 数字电路知识 * ARM硬件知识 * 熟练使用万用表和示波器 * 看懂芯片手册和原理图 4, linux内核源代码目录结构: * arch/: arch子目录包括了所有和体系结构相关的核心原创 2016-11-20 18:19:56 · 12239 阅读 · 7 评论 -
设备驱动中的kset(kernel-4.7)
koject分析中绕不开kset结构,kset是kobject扩展,它包含一个kobject的链表,可以方便地表示sysfs中目录与子目录的关系。kset结构体定义在include/linux/kobject.h文件中,其内容如下: struct sock;/** * struct kset - a set of kobjects of a specific type, belonging to原创 2016-12-08 19:28:09 · 630 阅读 · 0 评论 -
设备驱动中cdev(kernel-4.7)
linux系统将设备分为3类:字符设备、块设备、网络设备 1、字符设备:是指只能一个字节一个字节读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后数据。字符设备是面向流的设备,常见的字符设备有鼠标、键盘、串口、控制台和LED设备等。 2、块设备:是指可以从设备的任意位置读取一定长度数据的设备。块设备包括硬盘、磁盘、U盘和SD卡等。每一个字符设备或块设备都在/dev目录下对应一个设备原创 2016-12-29 16:51:38 · 659 阅读 · 0 评论 -
设备驱动中的iomem(kernel-4.7)
对于外设的访问,最终都是通过读写设备上的寄存器实现的,寄存器不外乎:控制寄存器、状态寄存器和数据寄存器,这些外设寄存器也称为“IO端口”,并且一个外设的寄存器通常是连续编址的。不同的CPU体系对外设IO端口物理地址的编址方式也不同,分为I/O映射方式(I/O-mapped)和内存映射方式(Memory-mapped)。Linux设计了一个通用的数据结构resource来描述各种I/O资源(如:I/O原创 2017-01-06 15:36:59 · 1260 阅读 · 0 评论 -
设备驱动中的misc(kernel-4.7)
Linux里面的misc杂项设备是主设备号为10的驱动设备,它的注册跟使用比较的简单,所以比较适用于功能简单的设备。 miscdevice共享一个主设备号MISC_MAJOR(即10),但次设备号不同。 所有的miscdevice设备形成了一个链表,对设备访问时内核根据次设备号查找对应的miscdevice设备,然后调用其file_operations结构中注册的文件操作接口进行操作。 在内核中用s原创 2017-01-05 21:49:17 · 1625 阅读 · 0 评论 -
设备驱动中的spin_lock(kernel-4.7)
在linux kernel的实现中,经常会遇到这样的场景:共享数据被中断上下文和进程上下文访问,该如何保护呢?如果只有进程上下文的访问,那么可以考虑使用semaphore或者mutex的锁机制,但是现在中断上下文也参和进来,那些可以导致睡眠的lock就不能使用了,这时候,可以考虑使用spin_lock。1、spin lock的特点 总结spin lock的特点如下: (1)spin lock是一原创 2017-01-03 23:24:27 · 1311 阅读 · 0 评论