AM3353平台上的Linux 3.2.0 IIO子文件系统框架的驱动

Linux驱动设备--IIO驱动 IIO 设备提供触发缓冲区支持时,必须设置 iiodev->pollfunc,触发器触发时执行它,该处理程序负责通过 indio_dev-> active_scan_mask查找启用的通道,检索其数据,并使用 iio_push_to_buffers_with_timestamp函数将它们提供给indio_dev-> buffer。此参数取决于设备,应参考其数据表。/sys/bus/iio/devices/triggerY/:一旦IIO触发器注册到IIO核心并且对应于索引为Y的触发器,就会创建该目录。 阅读详情

在Linux kernel 3.2已经引入了IIO子文件系统,但是驱动不多,毕竟刚开始的一个新的子文件系统 。在kernel 3.x版本中目录在drivers/staging/iio目录下,到了kernel 4.x版本下被移到了drivers/iio,显然大家认可了这个子文件系统的框架。

由于我所使用的平台是 kernel 3.2版本,在对DHT11的驱动上这一版本并没支持,需要自己的移植。虽然kernel 4.x有了支持,但是对整体版本升级,有所得不偿失。我就自己移植了。

下面的记录就是对移植过程的记录:

1、修改kernel-3.2/drivers/staging/iio目录下的industrialio-core.c文件:

static const char * const iio_chan_type_name_spec[] = {
        [IIO_VOLTAGE] = "voltage",
        [IIO_CURRENT] = "current",
        [IIO_POWER] = "power",
        [IIO_ACCEL] = "accel",
        [IIO_ANGL_VEL] = "anglvel",
        [IIO_MAGN] = "magn",
        [IIO_LIGHT] = "illuminance",
        [IIO_INTENSITY] = "intensity",
        [IIO_PROXIMITY] = "proximity",
        [IIO_TEMP] = "temp",
      	[IIO_HUMIDITYRELATIVE] = "humidityrelative",	//增加湿度
        [IIO_INCLI] = "incli",
        [IIO_ROT] = "rot",
        [IIO_ANGL] = "angl",
        [IIO_TIMESTAMP] = "timestamp",
        [IIO_CAPACITANCE] = "capacitance",
};
蓝色的文集是增加的,这个版本已经支持了温度,但是没有支持湿度,因此需要增加。

2、修改kernel-3.2/drivers/staging/iio目录下的iio.h文件:

enum iio_chan_type {
        /* real channel types */
        IIO_VOLTAGE,
        IIO_CURRENT,
        IIO_POWER,
        IIO_ACCEL,
        IIO_ANGL_VEL,
        IIO_MAGN,
        IIO_LIGHT,
        IIO_INTENSITY,
        IIO_PROXIMITY,
        IIO_TEMP,
        IIO_HUMIDITYRELATIVE,	//增加湿度
        IIO_INCLI,
        IIO_ROT,
        IIO_ANGL,
        IIO_TIMESTAMP,
        IIO_CAPACITANCE,
};


3、复制网上找到kernel 4.4.1版本中的/drivers/iio/humidity目录到kernel-3.2/drivers/staging/iio目录下,并修改Kconfig

source "drivers/staging/iio/humidity/Kconfig"

4、修改Makefile

obj-y += humidity/


在make menuconfig
 x     -> Device Drivers                                                                                   x
  x       -> Staging drivers (STAGING [=y])                                                                 x
  x         -> Industrial I/O support (IIO [=y])                                                            x
  x           -> Humidity sensors                                                                           x

5、因为kernel  4.4 相对 kernel 3.2 增加很对新函数所以不能直接使用原先的dht11.c驱动文件,需要自己重新编写,废话不多少。

#include <linux/err.h>
#include <linux/interrupt.h>
#include <linux/device.h>
#include <linux/kernel.h>
#include <linux/printk.h>
#include <linux/slab.h>
#include <linux/of.h>
#include <linux/of_device.h>
#include <linux/sysfs.h>
#include <linux/io.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/wait.h>
#include <linux/bitops.h>
#include <linux/completion.h>
#include <linux/mutex.h>
#include <linux/delay.h>
#include <linux/gpio.h>
#include <linux/of_gpio.h>
#include <linux/ktime.h>
//#include <linux/timekeeping.h>

//#include "/home/zuoyi/works/kernel-3.2/drivers/staging/iio/iio.h"
#include "../iio.h"


#define DRIVER_NAME	"dht11"

/* Convert GPIO signal to GPIO pin number */
#define GPIO_TO_PIN(bank, gpio) (32 * (bank) + (gpio))

#define DHT11_GPIO GPIO_TO_PIN(1, 26)


#define DHT11_DATA_VALID_TIME	2000000000  /* 2s in ns */

#define DHT11_EDGES_PREAMBLE 2
#define DHT11_BITS_PER_READ 40
/*
 * Note that when reading the sensor actually 84 edges are detected, but
 * since the last edge is not significant, we only store 83:
 */
#define DHT11_EDGES_PER_READ (2 * DHT11_BITS_PER_READ + \
			      DHT11_EDGES_PREAMBLE + 1)

/* Data transmission timing (nano seconds) */
#define DHT11_START_TRANSMISSION	18  /* ms */
#define DHT11_SENSOR_RESPONSE	80000
#define DHT11_START_BIT		50000
#define DHT11_DATA_BIT_LOW	27000
#define DHT11_DATA_BIT_HIGH	70000

struct dht11 {
	struct device			*dev;

	int				gpio;
	int				irq;

	struct completion		completion;
	/* The iio sysfs interface doesn't prevent concurrent reads: */
	struct mutex			lock;

	s64				timestamp;
	int				temperature;
	int				humidity;

	/* num_edges: -1 means "no transmission in progress" */
	int				num_edges;
	struct {s64 ts; int value; }	edges[DHT11_EDGES_PER_READ];
};

/* 读取单字节(8 bit)数据 */
static char DHT11_read_byte ( void )
{
	char DHT11_byte ;
	unsigned char i ;
	unsigned char temp ;
	
	DHT11_byte = 0 ;
	for ( i = 0 ; i < 8 ; i ++ )
	{
		temp = 0 ;
		while ( ! (gpio_get_value(DHT11_GPIO) ) ) 
		{
			temp ++ ;
			if ( temp > 12 )
				return 1 ;
			udelay ( 5 ) ;
		}
		temp = 0 ;
		while ( gpio_get_value(DHT11_GPIO)  )
		{
			temp ++ ;
			if ( temp > 20 )
				return 1 ;
			udelay ( 5 ) ;
		}
		if ( temp > 6 )
		{
			DHT11_byte <<= 1 ;
			DHT11_byte |= 1 ;
		} 
		else
		{
			DHT11_byte <<= 1 ;
			DHT11_byte |= 0 ;
		}
	}
	return DHT11_byte ;
}


static int dht11_read_raw(struct iio_dev *iio_dev,
			  const struct iio_chan_spec *chan,
			int *val, int *val2, long m)
{
	struct dht11 *dht11 = iio_priv(iio_dev);
	int ret;//, timeres;
	unsigned char DataTemp;
	unsigned char i;
	unsigned char err;
	char tempBuf[5]={0};

	unsigned char temp_int, temp_dec, hum_int, hum_dec, checksum;

	mutex_lock(&dht11->lock);

	err = 0 ;

	/* 管脚设置为输出并拉低电平 */
	gpio_direction_output(DHT11_GPIO, 0);
	msleep ( 18 );
	//mdelay ( 18 );
	gpio_set_value(DHT11_GPIO, 1);

	udelay ( 40 );
	gpio_direction_input(DHT11_GPIO);
	 
	if ( !err )
	{
		DataTemp = 10 ;
		while ( !( gpio_get_value(DHT11_GPIO) ) && DataTemp )
		{
			DataTemp --;
			udelay ( 10 );
		}
		if ( !DataTemp )
		{
			err = 1;
			ret = -EFAULT;
			goto err;
		}
	}
	if ( !err )
	{
		DataTemp = 10 ;
		while ( gpio_get_value(DHT11_GPIO) && DataTemp )
		{
			DataTemp --;
			udelay ( 10 );
		}
		if ( !DataTemp )
		{
			err = 1;
			ret = -EFAULT;
			goto err;
		}
	}

	if ( !err )
	{
		for ( i = 0; i < 5; i ++ )
		{
			tempBuf[i] = DHT11_read_byte () ;
		}
		DataTemp = 0 ;
		for ( i = 0; i < 4; i ++ )
		{
			DataTemp += tempBuf[i] ;
		}
		if ( DataTemp != tempBuf[4] )
		{
			ret = -EFAULT;
			goto err;
		}
	}

	hum_int = tempBuf[0];
	hum_dec = tempBuf[1];
	temp_int = tempBuf[2];
	temp_dec = tempBuf[3];
	checksum = tempBuf[4];

	if (((hum_int + hum_dec + temp_int + temp_dec) & 0xff) != checksum)
		return -EIO;

	//printk( "Humidity:%d.%d %%RH Temperature:%d.%d C  sum is:%d\n", tempBuf[0], tempBuf[1], tempBuf[2], tempBuf[3],tempBuf[4] ) ;

	dht11->temperature = (((temp_int & 0x7f)* 100) + temp_dec) * ((temp_int & 0x80) ? -1 : 1);
	dht11->humidity = ((hum_int * 100) + hum_dec);


	ret = IIO_VAL_INT;
	if (chan->type == IIO_TEMP)
		*val = dht11->temperature;
	else if (chan->type == IIO_HUMIDITYRELATIVE)
		*val = dht11->humidity;
	else
		ret = -EINVAL;
err:
	dht11->num_edges = -1;
	mutex_unlock(&dht11->lock);
	/* 管脚设置为输出并拉高 */
	gpio_direction_output(DHT11_GPIO, 1);
	return ret;
}

static const struct iio_info dht11_iio_info = {
	.driver_module		= THIS_MODULE,
	.read_raw		= dht11_read_raw,
};

//static const struct iio_chan_spec dht11_chan_spec[] = {
//	{ .type = IIO_TEMP,
//	  //.info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED), },
//	{ .type = IIO_HUMIDITYRELATIVE,
//	  //.info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED), }
//};

static const struct iio_chan_spec dht11_chan_spec[] = {
	{
		.type = IIO_TEMP,
		//.indexed = 2,
		.channel = 1,

	}, {
		.type = IIO_HUMIDITYRELATIVE,
		//.indexed = 1,
		.channel = 0,
	}
};


static const struct of_device_id dht11_dt_ids[] = {
	{ .compatible = "dht11", },
	{ }
};
MODULE_DEVICE_TABLE(of, dht11_dt_ids);


/* 探测函数 */

static int dht11_probe(struct platform_device *pdev)
{
	struct device *dev = &pdev->dev;
	//struct device_node *node = dev->of_node;
	struct dht11 *dht11;
	struct iio_dev *iio;
	int ret;

	/* 1、分配一个IIO设备 */
//	iio = devm_iio_device_alloc(dev, sizeof(*dht11));
//	if (!iio) {
//		dev_err(dev, "Failed to allocate IIO device\n");
//		return -ENOMEM;
//	}

	iio = iio_allocate_device(sizeof(struct dht11));
	if (!iio) {
		dev_err(dev, "Failed to allocate IIO device\n");
		return -ENOMEM;

	}

	/* 2、设置IIO设备 */
	dht11 = iio_priv(iio);
	dht11->dev = dev;

	/* 1、申请管脚 */
	ret = gpio_request(DHT11_GPIO, "dht11_gpio");
	if (ret)
		goto free_master;

	/* 2、管脚设置为输出并拉高 */
	gpio_direction_output(DHT11_GPIO, 1);
	
	platform_set_drvdata(pdev, iio);

	init_completion(&dht11->completion);
	mutex_init(&dht11->lock);
	iio->name = pdev->name;
	iio->dev.parent = &pdev->dev;
	iio->info = &dht11_iio_info;
	iio->modes = INDIO_DIRECT_MODE;
	iio->channels = dht11_chan_spec;
	iio->num_channels = ARRAY_SIZE(dht11_chan_spec);

	/* 3、注册一个IIO设备 */
	return iio_device_register(iio);
free_master:
		return ret;

}

static struct platform_driver dht11_driver = {
	.driver = {
		.name	= DRIVER_NAME,
		.of_match_table = dht11_dt_ids,
	},
	.probe  = dht11_probe,
};

module_platform_driver(dht11_driver);

MODULE_AUTHOR("zue ");
MODULE_DESCRIPTION("DHT11 humidity/temperature sensor driver");
MODULE_LICENSE("GPL v2");


很明显,我基本上没有使用原先驱动的思路,而是自己写的。


6、修改arch/arm/mach-omap2/board-am335xevm.c增加一个device驱动

/* add a dht11 */


static struct platform_device dht11_device = {
        .name           = "dht11",
        .id             = -1,
};

static void dht11_init(int evm_id, int profile )
{
        int err;

        err = platform_device_register(&dht11_device);
        if (err)
                pr_err("failed to register dht11 device\n");
        else
                pr_info("register dht11 device ok\n");
}

static struct evm_dev_cfg ok335x_dev_cfg[] = {
	......
        {dht11_init,   DEV_ON_BASEBOARD, PROFILE_ALL},

重新编译并烧写新内核。

[    0.091666] register dht11 device ok

在/sys/bus/iio/devices可以看到一个新的iio设备

/sys/bus/iio/devices # ls
iio:device0  iio:device1

/sys/devices/platform/dht11/iio:device1 # ls -l
total 0
-r--r--r--    1 0        0             4096 Jun 28 15:36 dev
-r--r--r--    1 0        0             4096 Jun 28 15:36 in_humidityrelative_raw
-r--r--r--    1 0        0             4096 Jun 28 15:36 in_temp_raw
-r--r--r--    1 0        0             4096 Jun 28 15:36 name
drwxr-xr-x    2 0        0                0 Jun 28 15:36 power
lrwxrwxrwx    1 0        0                0 Jun 28 15:36 subsystem -> ../../../../bus/iio
-rw-r--r--    1 0        0             4096 Jun 28 15:36 uevent

/sys/devices/platform/dht11/iio:device1 # cat name
dht11
/sys/devices/platform/dht11/iio:device1 # cat in_temp_raw 
2800
/sys/devices/platform/dht11/iio:device1 # cat in_humidityrelative_raw 
3100

获取的温度和湿度数据。注意获取真实数字需要除以100,例如2800/100=28摄氏度,3100/100=31%PH


也可以在下面的路径读取。其实是一样的。

/sys/devices/platform/dht11/iio:device1 # ls -l
total 0
-r--r--r--    1 0        0             4096 Jun 28 15:36 dev
-r--r--r--    1 0        0             4096 Jun 28 15:36 in_humidityrelative_raw
-r--r--r--    1 0        0             4096 Jun 28 15:36 in_temp_raw
-r--r--r--    1 0        0             4096 Jun 28 15:36 name
drwxr-xr-x    2 0        0                0 Jun 28 15:36 power
lrwxrwxrwx    1 0        0                0 Jun 28 15:36 subsystem -> ../../../../bus/iio
-rw-r--r--    1 0        0             4096 Jun 28 15:36 uevent



linux内核驱动:IIO子系统总结 iio子系统总结 阅读详情

相关推荐

避坑指南:CST粒子工作室Track Solver常见的5个参数设置错误

本文深入剖析了CST粒子工作室中Track Solver在电子枪仿真时常见的5个关键参数设置错误,包括空间电荷模型选择、发射源定义、材料边界处理、监视器配置及求解器稳定性设置。通过对比错误与正确做法,帮助用户避开陷阱,确保粒子追踪仿真的物理准确性与数值稳定性,从而获得更精准的电子枪仿真结果。

dapp9builder的博客 486

Linux驱动 | DHT11驱动

DHT11

欲盖弥彰1314 4353

Codesys.运动控制修改凸轮点

通过改凸轮曲线的主从轴缩放比例或者偏置。 新建多个凸轮曲线,对CAM曲线进行切换。 程序中动态修改,仅修改中间的关键点(凸轮末点修改or凸轮曲线运行中修改)。 程序中动态修改,修改首未关键点及关键点个数,需要重新触发MC_TableSelect。 使用程序新建凸轮表代码,实现电子凸轮基本运动。 我们讲的凸轮表切换、关键点修改、程序新建电子凸轮,这些方法没有本质区别,总之都是“趁曲线不注意,把凸轮表改了。

傻响雨 6826

Linux IIO驱动

工业场合里面也有大量的模拟量和数字量之间的转换,也就是我们常说的 ADC 和 DAC。而且随着手机、物联网、工业物联网和可穿戴设备的爆发,传感器的需求只持续增强。比如手机或者手环里面的加速度计、光传感器、陀螺仪、气压计、磁力计等,这些传感器本质上都是ADC,大家注意查看这些传感器的手册,会发现他们内部都会有个 ADC,传感器对外提供 IIC或者 SPI 接口,SOC 可以通过 IIC 或者 SP...

weixin_44708624的博客 984

使用3sigma原则去除数据表中的极端值

本文使用3sigma解决数据表中出现的极端值问题,其中包括基本原理、使用原则(检验方法)、代码展示这3个部分

qq_51397866的博客 4376

台达PLC使用RS485Modbus指令通信

台达PLC,RS485,Modbus RTU,从站梯形图,0X01,0X02,0X05,CRC校验

lilililimu的博客 1万+

Linux设备驱动之IIO子系统——IIO框架及IIO数据结构

由于需要对ADC进行驱动设计,因此学习了一下Linux驱动的IIO子系统。本文翻译自《Linux Device Drivers Development 》–John Madieu,本人水平有限,若有错误请大家指出。 IIO Framework 工业I / O(IIO)是专用于模数转换器(ADC)和数模转换器(DAC)的内核子系统。随着越来越多的具有不同代码实现的传感器(具有模拟到数字或数字到模拟,...

helloworld717的博客 7067

为什么devc++编译项目会失败?提示gcc无法正常启动...

根据你的描述,编译能正常进行时,只打开源文件并没有问题,问题主要出现在创建项目后编译失败,这通常与 Makefile 配置、环境变量、编译器路径设置等因素有关。你可以检查 Makefile 配置,验证 DevC++ 的编译器环境设置,或者尝试清理并重新配置项目。如果问题仍然存在,可以尝试重装 DevC++ 或重新配置工具链。希望如上措施及解决方案能够帮到有需要的你。

**My Coding Family** 1375

驱动程序开发:基于ICM20608六轴传感器 --- 使用Regmap API 的 SPI 读取数据 之 IIO驱动

IIO 全称是 Industrial I/O,翻译过来就是工业 I/O,大家不要看到“工业”两个字就觉得 IIO是只用于工业领域的。 实验IIO框架驱动icm20608六轴传感器。

morecrazylove的博客 2033

ESM2蛋白预训练模型 蛋白质、氨基酸向量表示

参考: https://github.com/facebookresearch/esm https://huggingface.co/facebook/esm2_t33_650M_UR50D https://esmatlas.com/resources?action=fold tokenizer_对输入蛋白会头尾添加cls、eos特殊字符,占两个字符长度 参考:https://github.com/facebookresearch/esm 直接clone下来代码

weixin_42357472的博客 1万+

AI原生应用评测:主流大语言模型性能对比

任务适配性:是否匹配应用的核心任务(如代码生成需强逻辑推理,内容创作需强创意性);上下文能力:处理长序列(如10万+字文档)的理解与生成能力;可靠性:幻觉(Hallucination)率、事实准确性、安全合规性;性价比:API调用成本、延迟、 scalability(扩展能力)。AI原生应用的核心是LLM与应用场景的深度协同。

架构师的AI之路,分享AI应用开发架构的学习与实践。 506

linux内核更换为3.2.0-32

1, 查找源提供的内核 apt-cache search linux-headers* apt-cache search linux-image* 查找相应版本的内核。 2 , 安装内核: 个人推荐安装: apt-get install linux-headers-3.2.0-32-generic apt-get install linux-image-3.2

z469571695的专栏 938

我装了10个ClawHub技能,这些最好用!

ClawHub就是Clawdbot的"应用商店"。Clawdbot是手机ClawHub是App Store技能就是各种App装了技能,Clawdbot才能干更多事。这个技能解决了我的信息过载问题。为什么装我订阅了很多Newsletter。每天收到一堆长文章,根本看不完。怎么用“总结这篇文章的核心观点”“把这个Newsletter提炼成3个要点”“这篇技术博客有哪些可以实践的建议?安装命令真实体验现在我收到长文章,直接转发给Clawdbot。它会提炼出核心要点和行动清单。

Maynor的博客 6099

linux-3.2.0内核-README翻译

Linux3.2.0 内核文件夹目录树 . ├── arch //该目录下主要 ├── block ├── build ├── COPYING ├── CREDITS ├── crypto ├── Documentation ├── drivers ├── firmware ├── fs ├── HEAD ├── hooks ├── include ├── info

shenwanjiang111的专栏 1289

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Linux保姆级升级安装openssl3.2.0版本教程

​ 作为一个基于密码学的安全开发包,OpenSSL提供的功能相当强大和全面,囊括了主要的密码算法、常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其它目的使用。​ OpenSSL是一个开放源代码的软件库包,应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连接者的身份。这个包广泛被应用在互联网的网页服务器上。​ OpenSSL整个软件包大概可以分成三个主要的功能部分:SSL协议库、应用程序以及密码算法库。OpenSSL的目录结构自然也是围绕这三个功能部分进行规划的。

qq_43127208的博客 5172

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

IIO子系统(Linux驱动开发篇)

1、原因 内部 ADC 将原始的模拟数据转换为数字量,然后通过其他的通信接口,比如 IIC、SPI等传输给SOC 当你使用的传感器的本质是ADC或者DAC,优先考虑使用IIO驱动框架 2、IIO子系统 主要介绍 设备结构体iio_dev,(描述一个具体 IIO 设备)====申请注册 以及内部包含的主要成员 iio_info、(描述ADC的通道信息) iio_chan_spec结构体(用户空间对设备的具体操作最终都会反映到iio_inf里面) /* @ 定义在include/linux/iio/ii

栋哥修炼日记 6329

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

移植Linux-3.4.2内核到S3C2440

一、BootLoader引导内核过程 1、Bootloader的工作 1.1、将内核读入内存 1.2、保存内核启动参数到指定位置,内核启动时去这个位置解析参数 1.3、启动内核、传入机器ID 二、内核的启动流程 内核首要目的是挂载根文件系统,启动应用程序,内核启动的过程大致为以下几步: 1.检查CPU和机器类型 ...

aogaozhu5689的博客 292

MS1112驱动开发(iio框架)

本文章是介绍iio框架,并基于之前ms1112的i2c驱动框架进行改写及测试

道阻其长,未来可期。笔耕不辍,行则将至! 4358

linux 内核版本的升级(linux-3.2.0升级到linux-3.2.1)

本人买的开发板是基于linux-3.2.0但是由于安装xenomai的时候没有对应的linux-3.2.0内核的补丁,于是想着将linux-3.2.0升级linux-3.2.21。 看到内核的说明文档applying-patches.txt里面有说明: # moving from 2.6.11 to 2.6.12 由linux 2.6.11升级到2.6.12 $ cd ~/linux-2.

Never too old to learn. 4760

am335x(linux3.2.0内核)编译安装Graphics_SDK_setuplinux_4_09_00_01

am335x linux3.2.0内核 编译Graphics_SDK_setuplinux_4_09_00_01_hardfp_minimal_demos.bin 注:sd卡启动盘插入到ubuntu10.04,sd卡显示的目录是/media/rootfs 一、Ubuntu 10.04 LTS 32位系统下安装ti-sdk-am335x-evm-06.00.00.00-Linux-x86-Ins...

nokiaxjw的专栏 2588

Linux内核之mmc子系统-sdio

现在的Linux内核中,mmc不仅是一个驱动,而是一个子系统。这里通过分析Linux3.2.0内核,结合TI的arm335x平台及omap_hsmmcd host分析下mmc子系统,重点关注sdio及架构在其上的具体sdio IP驱动实现。 1.      General overview 1.1 源码概览 Linux kernel把mmc,sd以及sdio三者的驱动代码整合在一起,俗称mm...

mrwangwang的专栏 1万+

hadoop3.2.0 linux版本国内镜像_Fabric2.0学习进阶——镜像部署网络(二)

2.1 下载Fabric源码创建源码存放的目录,本文将源码存放在/usr/local/src/hyperleger目录中,如读者机器上没有该目录需要执行以下命令手动创建:sudo mkdir -p /usr/local/src/hyperleger进入到该目录,使用git从github上下载fabric的源码,并切换到release-2.0的分支。cd /usr/local/src/hyperle...

weixin_28781243的博客 589

linux3.2.0块设备及nandflash驱动框架

块设备框架: app: open,read,write "1.txt" --------------------------------------------- 文件的读写 文件系统: vfat, ext2, ext3, yaffs2, jffs2 (把文件的读写转换为扇区的读写) -----------------ll_rw_block----------------- 扇区的读写 1. 把"读写"放入队列

jy1075518049的专栏 2071

Linux镜像1780是多少,代码阅读 - Linux\kernel\linux-5.0\drivers\iio\light\bh1780.c

/** ROHM 1780GLI Ambient Light Sensor Driver** Copyright (C) 2016 Linaro Ltd.* Author: Linus Walleij * Loosely based on the previous BH1780 ALS misc driver* Copyright (C) 2010 Texas Instruments* Autho...

weixin_35638013的博客 255
上一篇: AM3354之DHT11气温湿度传感器驱动和测试
下一篇: debian 64位下解决“bash ./没有那个文件或目录”的问题
代码很单纯,复杂的是人。
博客等级 码龄18年 95粉丝 53原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值