请教linux spi flash驱动下spi驱动问题

内核版本2.6.30。编进内核的SPI驱动,通过看代码我明白了,大致过程是这样:
1、先创建一个spi_board_info结构描述spi设备信息,调用spi_register_board_info将这个结构添加到board_list中。
2、然后调用spi_register_master注册SPI控制器驱动,此时会调用scan_boardinfo扫描board_list,根据
spi_board_info调用spi_new_device生成spi_device结构,用spi_add_device添加设备。
3、调用spi_register_driver注册spi_driver,通过与device匹配驱动设备。
下面是问题:
1、上述做法需要在注册spi控制器驱动即spi master前,先要定义好spi_board_info结构并注册。但是如果我要编写一个驱动模块,我应该怎样注册spi_device?
2、spi控制器是通过片选信号来区分多个spi设备的,这个片选信号是像I2C地址一样由设备定义好的吗?如何知道某个设备该用怎样的片选信号?
急用先学,最近刚好看了这一部分:
1、上述做法需要在注册spi控制器驱动即spi master前,先要定义好spi_board_info结构并注册。但是如果我要编写一个驱动模块,我应该怎样注册spi_device?
spi_device就是就是通过& & spi_register_board_info 来注册的。
通过spi_board_info结构,给定设备的下面信息:
设备挂在哪个spi总线上,如powerpc 5000有SPI A, B, C ,D
#define SPI_AK4104& && &\
659{& && && && && && && &&&\
660& && &&&.modalias& && & = "ak4104-codec",& && & \设备名
661& && &&&.max_speed_hz& &= 10000,& && && && && & \波特率
662& && &&&.bus_num& && &&&= 0,& && && && && && &&&\SPI A, B, C ,D
663& && &&&.chip_select& & = 0,& && && && && && &&&\片选(0~7)
664& && &&&.controller_data = (void *) GPIO_SPDIF_CS,\平台数据
#define SPI_DAC7512& &&&\
679{& && & \
680& && &&&.modalias& && & = "dac7512",& && && && &\设备名
681& && &&&.max_speed_hz& &= 1000000,& && && && &&&\波特率
682& && &&&.bus_num& && &&&= 0,& && && &&&\ SPI A, B, C ,D
683& && &&&.chip_select& & = 2,& && && && &\片选(0~7)
684& && &&&.controller_data = (void *) GPIO_MCLK_DAC_CS,& &\
static struct spi_board_info connector_spi_devices[] __initdata = {
& && && &SPI_AK4104,
& && && &SPI_DAC7512,
调用下面函数,就把上面两个设备登记到/sys/bus/spi下了
& & spi_register_board_info(ARRAY_AND_SIZE(connector_spi_devices));
2、spi控制器是通过片选信号来区分多个spi设备的,这个片选信号是像I2C地址一样由设备定义好的吗?如何知道某个设备该用怎样的片选信号?
硬件连线决定的。
上面的例子,spi bus A上挂了上面两个设备:AK4104/DAC7512
SPI接口有下列信号线:
SCK_A: 时钟,同两个设备的时钟信号接在一起
SIN_A:&&&&同两个设备的data out信号接在一起
SOUT_A 同两个设备的data in信号接在一起
PCS0_A:&&bus A chip select 0, 接AK4104的片选
PCS2_A:&&:&&bus A chip select 2,接DAC7512的片选
如果先选中chip select 0, 下面的操作就会作用于设备AK4104
如果先选中chip select 2, 下面的操作就会作用于设备DAC7512
阅读(...) 评论() &君,已阅读到文档的结尾了呢~~
Linux下spi驱动开发
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
Linux下spi驱动开发
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口17:24 提问
linux 内核 spi驱动出错
请教,我在linux下(2.6.32)进行gpio模拟spi操作,但是当我调用spi_register_board_info
函数的时候,代码死机了,其具体情况如下:
static struct spi_board_info stm32_board_info = {
.modalias = "stm32-spi",
.max_speed_hz = ,
.bus_num = 1,
.mode = SPI_MODE_0,
ret = spi_register_board_info(&stm32_board_info, 1);
do_cpu invoked from kernel context![#1]:
: fdbd6 000001
: 81c97c84
: 3a16c6c 1210a
: 7fa44 2a60d837
: 826e02c0 81fa1e08 826e7f0
: 81fa1e08 e9d90 004fdb68
: 81fa30 004fdbc6 81c82684
: 17b44000
: 801df82c spi_register_board_info+0x4/0xa0
// 该接口挂了
Tainted: P
: 81c82684 para_init+0x30/0xd8 [umac]
Status: 1000ff03
KERNEL EXL IE
Cause : 9080002c
(MIPS 24Kc)
Modules linked in: wvas_wloc wbs_sec aclk rg_data_plane efqos_kernel roamk rg_wvlan proc_info ar93xx_et eth_subif umac ath_dev(P) ath_rate_atheros(P) ath_hal asf(P) adf(P) wbs_fwd_intf capwap_kernel rg_wlibk wbuf wbs_mng ef_bridge_ko af_packet ipv4 ref_ip eth_parser srvk net2con fpm_k ref_frame lsm_ko wbs_dev dm_chardev env_utils setmac_utils product_info_utils get_envi mtdoops rg_console rg_sysfs rg_thread_det rg_lowmem_killer rg_dprintk
Process wbs_mng.elf (pid: 603, threadinfo=81fa0000, task=82a64038, tls=2aab7770)
Stack : c8c89c c0 81ca88 81fa1b70
01 01 81fa1e08 81c4bd1c
fdbc6 00 81fa1b2c
a50 81fa1a5c 81fa1a50 00
9c000 ff 00
Call Trace:
[] spi_register_board_info+0x4/0xa0
[] para_init+0x30/0xd8 [umac]
[] rj_ath_wloc_set_tcl_cb+0x12c/0x14c [umac]
[] ath_ioctl+0x1b8/0x82c [umac]
[] dev_ioctl+0x664/0x71c
[] vfs_ioctl+0x2c/0x70
[] do_vfs_ioctl+0x5a0/0x5f8
[] sys_ioctl+0x48/0x7c
[] stack_done+0x20/0x3c
Fatal exception: panic in 5 seconds
Kernel panic - not syncing: Fatal exception
Call Trace:
[] dump_stack+0x8/0x34
[] panic+0x68/0x13c
[] die+0xc8/0xd0
[] do_cpu+0x38/0x268
[] ret_from_exception+0x0/0xc
[] spi_register_board_info+0x4/0xa0
[] para_init+0x30/0xd8 [umac]
[] rj_ath_wloc_set_tcl_cb+0x12c/0x14c [umac]
[] ath_ioctl+0x1b8/0x82c [umac]
[] dev_ioctl+0x664/0x71c
[] vfs_ioctl+0x2c/0x70
[] do_vfs_ioctl+0x5a0/0x5f8
[] sys_ioctl+0x48/0x7c
[] stack_done+0x20/0x3c
自身没感觉到调用的时候产生了啥错误,请帮忙指点下;
按赞数排序
其他相关推荐云栖社区()为您免费提供linux驱动 spi 实时性相关的问答和话题,同时为你提供linux spi驱动,linux spi驱动框架,linux spi驱动详解,linux spi设备驱动,linux下spi驱动开发等,云栖社区以分享专业、优质、高效的技术为己任,帮助技术人快速成长与发展!新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
稍有积蓄, 积分 230, 距离下一级还需 270 积分
论坛徽章:0
内核版本2.6.30。编进内核的SPI驱动,通过看代码我明白了,大致过程是这样:
1、先创建一个spi_board_info结构描述spi设备信息,调用spi_register_board_info将这个结构添加到board_list中。
2、然后调用spi_register_master注册SPI控制器驱动,此时会调用scan_boardinfo扫描board_list,根据spi_board_info调用spi_new_device生成spi_device结构,用spi_add_device添加设备。
3、调用spi_register_driver注册spi_driver,通过与device匹配驱动设备。
下面是问题:
1、上述做法需要在注册spi控制器驱动即spi master前,先要定义好spi_board_info结构并注册。但是如果我要编写一个驱动模块,我应该怎样注册spi_device?
2、spi控制器是通过片选信号来区分多个spi设备的,这个片选信号是像I2C地址一样由设备定义好的吗?如何知道某个设备该用怎样的片选信号?
&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp
白手起家, 积分 125, 距离下一级还需 75 积分
论坛徽章:0
1、上述做法需要在注册spi控制器驱动即spi master前,先要定义好spi_board_info结构并注册。但是如果我要编写一个驱动模块,我应该怎样注册spi_device?
&象 spi_master 一样注册你的设备.
2、spi控制器是通过片选信号来区分多个spi设备的,这个片选信号是像I2C地址一样由设备定义好的吗?如何知道某个设备该用怎样的片选信号?
&和i2c 不同,i2c 是通过地址选择从设备。 spi 的cs 是对被选设备而言。 一般是 H /L 表示enable/disable 从设备 。
富足长乐, 积分 7205, 距离下一级还需 795 积分
论坛徽章:1
急用先学,最近刚好看了这一部分:
1、上述做法需要在注册spi控制器驱动即spi master前,先要定义好spi_board_info结构并注册。但是如果我要编写一个驱动模块,我应该怎样注册spi_device?
spi_device就是就是通过& & spi_register_board_info 来注册的。
通过spi_board_info结构,给定设备的下面信息:
设备挂在哪个spi总线上,如powerpc 5000有SPI A, B, C ,D
#define SPI_AK4104& && &\
659{& && && && && && && &&&\
660& && &&&.modalias& && & = &ak4104-codec&,& && & \设备名
661& && &&&.max_speed_hz& &= 10000,& && && && && & \波特率
662& && &&&.bus_num& && &&&= 0,& && && && && && &&&\SPI A, B, C ,D
663& && &&&.chip_select& & = 0,& && && && && && &&&\片选(0~7)
664& && &&&.controller_data = (void *) GPIO_SPDIF_CS,\平台数据
#define SPI_DAC7512& &&&\
679{& && & \
680& && &&&.modalias& && & = &dac7512&,& && && && &\设备名
681& && &&&.max_speed_hz& &= 1000000,& && && && &&&\波特率
682& && &&&.bus_num& && &&&= 0,& && && &&&\ SPI A, B, C ,D
683& && &&&.chip_select& & = 2,& && && && &\片选(0~7)
684& && &&&.controller_data = (void *) GPIO_MCLK_DAC_CS,& &\
static struct spi_board_info connector_spi_devices[] __initdata = {
& && && &SPI_AK4104,
& && && &SPI_DAC7512,
调用下面函数,就把上面两个设备登记到/sys/bus/spi下了
& & spi_register_board_info(ARRAY_AND_SIZE(connector_spi_devices));
2、spi控制器是通过片选信号来区分多个spi设备的,这个片选信号是像I2C地址一样由设备定义好的吗?如何知道某个设备该用怎样的片选信号?
硬件连线决定的。
上面的例子,spi bus A上挂了上面两个设备:AK4104/DAC7512
SPI接口有下列信号线:
SCK_A: 时钟,同两个设备的时钟信号接在一起
SIN_A:&&&&同两个设备的data out信号接在一起
SOUT_A 同两个设备的data in信号接在一起
PCS0_A:&&bus A chip select 0, 接AK4104的片选
PCS2_A:&&:&&bus A chip select 2,接DAC7512的片选
如果先选中chip select 0, 下面的操作就会作用于设备AK4104
如果先选中chip select 2, 下面的操作就会作用于设备DAC7512
稍有积蓄, 积分 230, 距离下一级还需 270 积分
论坛徽章:0
本帖最后由 frank529 于
13:25 编辑
linuxfellow 发表于
回复 1# frank529
急用先学,最近刚好看了这一部分:
1、上述做法需要在注册spi控制器驱动即spi master前 ...
谢谢楼上两位的回复。
用spi_register_board_info(ARRAY_AND_SIZE(connector_spi_devices));注册SPI设备,只是将spi_board_info 结构挂在board_list上,真正创建spi device结构的是scan_boardinfo函数。而scan_boardinfo只在spi_register_master函数中调用。如果要在模块中注册spi_device,此时master已经注册过了,scan_boardinfo函数不会被调用,那spi_device结构从哪里来呢?
片选的话,如果我CPU上只有NCS0、NCS1、NCS2和NCS3四根线,那是不是只能挂4个SPI设备?
富足长乐, 积分 6352, 距离下一级还需 1648 积分
论坛徽章:17
scan_boardinfo函数还不是依靠spi_new_device(), spi_alloc_device(), spi_add_device()来向设备字系统注册,你直接依靠这些函数自己注册个spi_device不就得了。。。
片选如果你想挂超过4个SPI设备,那自己做译码片选就是。。。外面加2个3-8译码器解决问题。。。
稍有积蓄, 积分 230, 距离下一级还需 270 积分
论坛徽章:0
本帖最后由 frank529 于
14:10 编辑
asuka2001 发表于
回复 4# frank529
scan_boardinfo函数还不是依靠spi_new_device(), spi_alloc_device(), spi_add_devic ...
spi_alloc_device的参数是master,之前不知道怎么在模块中获取master,现在知道了,用spi_busnum_to_master
富足长乐, 积分 6352, 距离下一级还需 1648 积分
论坛徽章:17
spi_busnum_to_master()
小富即安, 积分 2034, 距离下一级还需 2966 积分
论坛徽章:0
我记得某个版本里是不能单独添加SPI device的,当时总结SPI与I2C子系统不同时还提出过,注册适配器时要把适配器上存在的设备都带起来,SPI实例化设备时只有这一个时机,I2C却可以在任何时候注册。
我以前做这个的时候还像把某部分代码改了才能在其它时候添加SPI设备。那是半年前的事了,可能当时没发现有其它方法。
稍有积蓄, 积分 230, 距离下一级还需 270 积分
论坛徽章:0
擦,搞了半天,只有添加spi设备的函数,没有删除spi设备的函数,看来spi子系统设计时就没有考虑模块加载的情况,得自己写个函数了。
白手起家, 积分 53, 距离下一级还需 147 积分
论坛徽章:0
& &spi_alloc_device的参数是master,之前不知道怎么在模块中获取master,现在知道了,用spi_busnum_to_master
spi_busnum_to_master是啥作用?我还是不明白}

我要回帖

更多关于 linux spi从设备驱动 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信