linux spi驱动

sunxi-fel增加对16M以上Flash的支持 由于SPI flash 的地址是24bit,也就是最大16M 地址空间,所以对于32M flash,需要增加bank切换支持。 uboot中有CONFIG_SPI_FLASH_BAR选项可以使能bank切换。 但是sunxi-fel中尚未支持,所以下载的时候超出16M会循环覆盖掉。 这里介绍对sunxi-fel增加16M以上flash支持的方法。 1 u-boot的支持 drivers/mtd/s... 阅读详情

https://blog.youkuaiyun.com/chenliang0224/article/details/51057109

最近在学习Linux spi驱动,中途出现了诸多疑问,天苍苍野茫茫,坚持总是可以看到牛羊的,本文以新唐NUC972这颗芯片为例进行逐步分析
 
参考很有价值的两篇文章:
	http://www.th7.cn/system/lin/201507/122488.shtml
	http://blog.chinaunix.net/uid-25445243-id-4026974.html
	
1、SPI 总线注册
	源码路径:drivers/spi/spi.c
	有兴趣的可以看下这位大神的文章,很详细http://blog.chinaunix.net/uid-25445243-id-4032371.html
	
2、spidev.c
	源码路径:drivers/spi/spidev.c
	如果不想写具体的芯片驱动,就可以用kernel自带的驱动spidev.c(这里是困扰我的地方,之前一直没搞明白这里有了
	spi驱动程序,为啥还要编写,因为某个设备对应的驱动必须是唯一的,而驱动却可以对应多个设备),在板级信息spi_board_info
	结构体中将.modalias = "spidev"即可,因为spidev.c中已经驱动取名为“spidev”
 
3、SPI platform_device设备注册 
	源码路径:arch/arm/mach-nuc970/dev.c
	
	static struct nuc970_spi_info nuc970_spi0_platform_data = {
        .num_cs		= 1,
        .lsb		= 0,
        .txneg		= 1,
        .rxneg		= 0,
        .divider	= 4,
        .sleep		= 0,
        .txnum		= 0,
        .txbitlen	= 8,
        .bus_num	= 0,	//注意这个参数很重要!表示SPI控制器的编号是0,将来在spi从设备的
							//板级信息中有体现,意思是将来这个spi从设备挂在编号为0的spi总线下面;
	};
	
	static struct resource nuc970_spi0_resource[] = {
        [0] = {
                .start = NUC970_PA_SPI0,
                .end   = NUC970_PA_SPI0 + NUC970_SZ_SPI0 - 1,
                .flags = IORESOURCE_MEM,
        },
        [1] = {
                .start = IRQ_SPI0,
                .end   = IRQ_SPI0,
                .flags = IORESOURCE_IRQ,
        }
	};
	
	struct platform_device nuc970_device_spi0 = {
        .name		  = "nuc970-spi0",	//设备名
        .id		  = -1,
        .num_resources	  = ARRAY_SIZE(nuc970_spi0_resource),
        .resource	  = nuc970_spi0_resource,
		#if defined(CONFIG_MTD_M25P80) || defined(CONFIG_SPI_SPIDEV)
        .dev		= {
                .platform_data = &nuc970_spi0_platform_data,
		}
		#endif
	};
	
	static struct platform_device *nuc970_public_dev[] __initdata = {
        &nuc970_device_spi0,
	}
 
	//注册spi设备
	void __init nuc970_platform_init(struct platform_device **device, int size)
	{
		platform_add_devices(device, size);
		platform_add_devices(nuc970_public_dev, ARRAY_SIZE(nuc970_public_dev));
	}
 
4、SPI platform_driver驱动注册
	源代码路径:drivers/spi/spi-nuc970-p0.c
	
	static struct platform_driver nuc970_spi0_driver = {
		.probe		= nuc970_spi0_probe,	//由于platform_device先于platform_driver注册,所以设
											//备.name=设备驱动.name时将回调nuc970_spi0_probe
		.remove		= nuc970_spi0_remove,
		.driver		= {
			.name	= "nuc970-spi0",
			.owner	= THIS_MODULE,
		},
	};
	
	//注册spi驱动
	module_platform_driver(nuc970_spi0_driver);
 
	
5、SPI从设备板级信息 以M25P80 norflash芯片为例
	源码路径:arch/arm/mach-nuc970/dev.c
	
	#if defined(CONFIG_SPI_FLASH_W25Q)
	 static struct gsc3280_spi_info w25q_spi1_dev_platdata = {
		 .cs_type            = 1,
		.pin_cs            = 87,
		.num_cs            = 1,
		.cs_value            = 0,
		.lsb_flg            = 0,
		.bits_per_word    = 8,
	};
	#endif
	static struct spi_board_info gsc3280_spi_devices[] = {
	#if defined(CONFIG_SPI_FLASH_W25Q)
		{
			.modalias        = "spi-w25q",
			.bus_num        = 0,//注意这个参数很重要(参考第3点解释)!这个从设备将挂在编号为0的总线上,
								//这样从设备“spi-w25q”就与“nuc970-spi0”平台总线(控制器驱动)连接起来了
			.chip_select        = 2,
			.mode            = SPI_MODE_3,
			.max_speed_hz    = 5 * 1000 * 1000,
			.controller_data    = &w25q_spi1_dev_platdata,
		},
	#endif
	};
	
	//注册“spi-w25q”板级信息
	static int __init gsc3280_spi_devices_init(void)
	{
		spi_register_board_info(gsc3280_spi_devices, ARRAY_SIZE(gsc3280_spi_devices));
		return 0;
	}
	device_initcall(gsc3280_spi_devices_init);
	
6、SPI 从设备驱动程序(以字符设备,att7022e就是通过这里进行操作的)
	static struct spi_driver w25q_driver = {
		.driver    = {
			.name    = "spi-w25q",
			.owner    = THIS_MODULE,
		},
		//.id_table    = w25q_ids,
		.probe    = w25q_probe,
		.remove    = __devexit_p(w25q_remove),
	};
 
 
	static int __init w25q_init(void)
	{
		return spi_register_driver(&w25q_driver);
	}
	static void __exit w25q_exit(void)
	{
		spi_unregister_driver(&w25q_driver);
	}
	module_init(w25q_init);
	module_exit(w25q_exit);
	
	......
	
	花了一个三天的时间才搞明白SPI驱动的注册原理。。。

 

Linux之 SPI 驱动框架- spi-mem 框架 那么问题来了, 为什么要开发新的 SPI 存储器接口?有了这个新的框架, SPI NOR 和SPI NAND 都可以基于相同的SPI控制器驱动进行支持了。m25p80 驱动将被修改成,使用spi-mem 接口,取代具有局限性的spi_flash_read() 接口。目前, 我们仍然有专用的SPI NOR控制器,但是最终是移除他们,并将他们移植为 drivers/spi/ 下 的普通SPI控制器驱动。 阅读详情

相关推荐

【ARM】新唐NUC977移植WK2124驱动

目前WK系列能实现SPI扩展uart的芯片包括WK2124、WK2204、WK2168、WK2132。目前WK2124、WK2204、WK2168能实现SPI扩展4路UART,WK2132能实现扩展2路UART。目前这几款芯片使用的都是相同的linux驱动。WK系列扩展的子通道的UART具备如下功能特点每个子通道UART的波特率、字长、校验格式可以独立设置,最高可以提供2Mbps的通信速率。https提取码ix73httpshttpshttps。......

凉开水白菜的博客 1386

NUC972触摸屏驱动移植过程分析(一)

因为下一个项目可能会用到触摸屏,所以这段时间对触摸屏的驱动的移植进行了研究,今天正好有机会,谈谈移植过程。 其实基于开发板对触摸屏驱动进行移植,需要做的工作并不是太多,因为大部分工作开发板的供应商已经提供好了,但是用起来总是不尽人意,所以需要进一步优化,废话少说,步入正题。 首先看一下硬件电路,如下图所示: 开发板上使用的是TSC2007作为驱动触摸屏(电阻屏)的驱动芯片,没有使用nuc...

b7376811的博客 2952

linux SPI驱动开发

SPI中断的步骤:linux内核分离思想的实现基于platform机制原理 第一步:向内核注册SPI总线以及SPI主机控制器; 第二步:向内核申请一个SPI主机控制器的空间,注册我们要用的主机控制器; 第三步:向内核注册SPI设备,以及构造file_operation结构体; 重点关注struct platform_device和struct platform_driver这两个结构体。底层简历连接以后用户空间就可以通过open、write、read、ioctl函数来操作字符设备spidev了。

wangjie36的博客 2077

nuc972 配置成SPI nor flash 启动

nuc972开发板用的是w25q128的spi nor flash. 做了如下事情是的可以支持文件系统放在nor flash上: sudo apt install mtd-utils, 以获得mkfs.jffs2 mkfs.jffs2 -s 0x100 -e 0x10000 -p 0x800000 -d rootfs_48_refine/ -o jffs2.img rootfs_48_refine是精简了原先的rootfs, 原来的有几十兆, 因为nor flash 比较小, 删除到剩下几M。

zjuwuyu75的博客 1480

antv x6 沿边图标循环动画实现

2.使用transition给边设置动画,利用complte方法实现循环动画。实现效果,如下图,边上存在两个图标,要求图标延边一直循环动画。1.注册一个自定义边,边上定义两个图标,并设置其初始位置。

lingliu0824的博客 3366

ESP-01S获取网络时间踩坑全记录:AT指令调试、JSON解析乱码、时区处理,一个都不能少

本文详细记录了使用ESP-01S WIFI模块获取网络时间的完整过程,包括AT指令调试、JSON解析乱码处理以及时区转换等关键步骤。通过实战案例和代码示例,帮助开发者避开常见陷阱,实现稳定的网络时间同步功能。

weixin_30460489的博客 295

Linux SPI驱动(Linux驱动开发篇)

1.linux SPI驱动 由于裸机的驱动迎合驱动的分离和分层的思想,分为SPI主机驱动(接口驱动)和SPI设备驱动. 这种思想的好处,请看我写的另外一篇文章Linux驱动的分离和分层。 其中上面说的裸机驱动请看这篇文章裸机SPI驱动 但是裸机的驱动是没有加入操作系统的 本文也是遵循Linux驱动的分离和分层的思想,因此linux内核把SPI驱动分为两个部分SPI总线驱动和SPI设备驱动 总线驱动:SOC的SPI控制器驱动,也叫做SPI适配器驱动 设备驱动:SPI设备驱动就是针对具体的S

栋哥修炼日记 8911

成本150元的高性能RDP协议瘦客户机

云终端市场是一个跨度很大的市场。既有数千元的品牌的瘦客户机,也有几百元的瘦客户机,还有200-300元的支持RDP协议的多用户云终端。但是200-300元的多用户终端,在显示性能上不尽人意,一般用于地产中介门店,工厂产线的电子看板等场合。有没有性能更好,价格更低的方案呢? 答案是有。 这个方案就是 二手的x86 瘦客户机 + DoraOS瘦客户机系统免费版(仅支持RDP)。 首先我们看硬件,在某宝搜索 升腾C92 ,找到最低配置的( CPU:J1800,内存:2G,硬盘:8G)。价格都在150以内。

云飞扬的桌面云 7412

Linux SPI驱动

1.Linux下SPI驱动框架 SPI 驱动框架和 I2C 很类似,都分为主机控制器驱动和设备驱动,主机控制器也就是 SOC的 SPI 控制器接口。比如在裸机篇中的《第二十七章 SPI 实验》,我们编写了 bsp_spi.c 和 bsp_spi.h这两个文件,这两个文件是 I.MX6U 的 SPI 控制器驱动,我们编写好 SPI 控制器驱动以后就可以直接使用了,不管是什么 SPI 设备,SPI ...

weixin_44708624的博客 1586

CloudCompare横截面工具实战:从点云切片到轮廓提取的完整流程

本文详细介绍了CloudCompare软件中Cross Section工具的核心功能与实战流程。从交互式裁剪框的精准操控,到包络线提取的参数设置与优化,再到内部轮廓提取及批量处理技巧,完整解析了如何从三维点云中高效提取建筑立面、隧道断面等关键轮廓信息,是点云数据处理与分析的实用指南。

weixin_29290963的博客 286

【影像组学】用3Dslicer或Python提取影像组学特征

用3Dslicer或Python提取影像组学特征

abdslfwoeugp 1万+

嵌入式Linux SPI驱动 编写SPI设备驱动程序 spi_transfer spi_message

嵌入式Linux SPI驱动 编写SPI设备驱动程序 详细解析

你要拥有一个你喜欢并且热爱的人生 8409

Python进阶005:修改Jupyter Notebook的工作路径

1、Jupyter Notebook简介 2、修改Jupyter Notebook的工作路径 如下三个步骤: 一、安装notebook 在CMD命令行中输入: pip install notebook 二、启动notebook jupyter notebook 启动后发现是在你的用户目录下,如下图所示,但是该目录下有很多的其他文件或文件夹,因此我想把这个环境切换到我单门创建的一个文件夹中。 三、创建notebook的配置文件 在CMD命令行中执行: jupyter notebook --genera

若北辰 1386

Linux SPI 驱动实验

从示例代码 62.2.3 可以看出,spi_imx_buf_tx_u8 函数是通过 MXC_SPI_BUF_TX 宏来实现的。比如在裸机篇中的《第二十七章 SPI 实验》,我们编写了 bsp_spi.c 和 bsp_spi.h这两个文件,这两个文件是 I.MX6U 的 SPI 控制器驱动,我们编写好 SPI 控制器驱动以后就可以直接使用了,不管是什么 SPI 设备,SPI 控制器部分的驱动都是一样,我们的重点就落在了种类繁多的 SPI 设备驱动。

qq_28576837的博客 1257

存储硬盘格式怎么把512还原为520格式??

硬盘厂商工具(如SeaChestsg_format)可以调整扇区大小。备份数据,因为调整扇区会清除硬盘内容。根据硬盘型号和接口类型,选择合适的工具进行调整。如果你需要更详细的帮助,请提供你的硬盘型号和存储设备类型。希望如上措施及解决方案能够帮到有需要的你。PS:如若遇到采纳如下方案还是未解决的同学,希望不要抱怨&&急躁,毕竟影响因素众多,我写出来也是希望能够尽最大努力帮助到同类似问题的小伙伴,即把你未解决或者产生新Bug黏贴在评论区,我们大家一起来努力,一起帮你看看,可以不咯。

**My Coding Family** 1146

RK3568平台开发系列讲解(项目篇)手写数字识别

📢 本篇章带大家基于飞桨(PaddlePaddle),完成一个简单的手写数字识别任务。

内核笔记 1182

Linux: SPI 驱动

linux, spi驱动

JiMoKuangXiangQu的专栏 3344

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Linux SPI 驱动

Linux SPI 驱动

weixin_48085453的博客 1247

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Linux SPI驱动框架

Linux SPI总线使用 原文链接:https://blog.youkuaiyun.com/weixin_42397613/article/details/105018016 简介 SPI总线是很常用的总线类型,有好多设备的数据接口都采用了SPI总线,比如ICM20608加速度陀螺仪传感器。在Linux中,SPI设备是采用了Linux惯用的设备模型:driver->bus->device,此总线类型是SPI总线,driver就是我们针对某一SPI设备所编写的设备驱动,使用bus给我们提供的SPI总线操控

宁静致远的博客 3655

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Linux SPI驱动框架剖析

转载地址:http://blog.youkuaiyun.com/kunkliu/article/details/72983590Linux SPI驱动框架剖析 http://www.cnblogs.com/lubiao/p/4806146.html (说明:我的开发平台是TQ210,处理器是cotex-A8架构的s5pv210,Linux内核版本:linux-3.10.46。) 一、SPI(Serial Per

kunkliu的博客 2049

Linux 驱动入门(8)—— SPI驱动

常见示例:引脚含义DO(MOSI)SPI主控用来发出数据,SPI从设备用来接收数据DI(MISO)SPI主控用来发出数据,SPI从设备用来接收数据SCKSerial Clock,时钟CSChip Select,芯片选择引脚数模转换器 (DAC) 是一种与模数转换器功能相反的器件,可以将数字形式的数据转换为相应的模拟电压信号。通用 DAC 模块是 12 位字转换器,带有两个支持立体声音频的输出通道。

wei_Embedded_z的博客 2960

Linux驱动开发:SPI驱动开发原理

在 Linux 内核中,负责管理平台设备()和平台驱动()的匹配过程。定义了一个match函数,当有新的平台设备或平台驱动注册到系统时,内核会调用这个match函数来判断设备和驱动是否匹配。如果匹配成功,内核会调用驱动的probe函数来初始化设备。return!return 1;return 1;= NULL;检查设备的driver_override字段;尝试使用设备树(of)风格匹配;尝试使用ACPI风格匹配;尝试依据驱动的id_table进行匹配。

weixin_42937740的博客 1463

linux spi驱动分析

昇腾310 spi驱动详解准备设备树节点和驱动的匹配spi控制器驱动详解 准备 使用的源码包为华为官方的ascend200AI加速模块的SDK,其下载地址位于:点击跳转 使用的固件与驱动版本为:1.0.9.alpha 压缩包名称为:A200-3000-sdk_20.2.0.zip 将A200-3000-sdk_20.2.0.zip解压后可以看到Ascend310-source-minirc.tar.gz压缩包,这个压缩包里有ascend200AI加速模块的linux内核源码包、设备树及驱动文件等。 设备树节

feidayekuangkuang的博客 2894

Linux驱动学习(SPI驱动)

本文介绍了SPI总线协议及其驱动开发流程。主要内容包括:1)SPI硬件框架和四种工作模式(CPOL/CPHA组合);2)Linux SPI总线驱动模型,包括设备树匹配、控制器注册和spi_master结构体解析;3)spidev通用驱动程序的实现原理和使用方法;4)通过DAC芯片应用实例,详细说明了SPI数据传输的位操作处理;5)自定义SPI设备驱动开发,重点阐述了spi_message构建和spi_sync同步传输机制。文章最后对比了SPI与I2C设备驱动的异同,为嵌入式SPI设备开发提供了完整的技术参考

weixin_71568456的博客 1366
上一篇: linux pinctrl驱动
下一篇: NUC972触摸屏驱动移植过程分析(一)
oshan2012
博客等级 码龄15年 300粉丝 91原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值