spi driverWord文件下载.docx
- 文档编号:17912007
- 上传时间:2022-12-12
- 格式:DOCX
- 页数:26
- 大小:27.99KB
spi driverWord文件下载.docx
《spi driverWord文件下载.docx》由会员分享,可在线阅读,更多相关《spi driverWord文件下载.docx(26页珍藏版)》请在冰豆网上搜索。
内核不关心你使用的是platform_device还是spi_device,内核只关心你的structdevice结构体,内核通过这个structdevice结构体自然能够顺藤摸瓜找到你是platform_device还是spi_device,这就是linux最引以为傲的contian_of()大法。
驱动通过structdriver这个结构体来定义,与structdevice一致,你也可以用自己的结构体去封装:
例如,structplatform_driver。
structplatform_driver{
int(*probe)(structplatform_device*);
int(*remove)(structplatform_device*);
void(*shutdown)(structplatform_device*);
int(*suspend)(structplatform_device*,pm_message_tstate);
int(*suspend_late)(structplatform_device*,pm_message_tstate);
int(*resume_early)(structplatform_device*);
int(*resume)(structplatform_device*);
structdevice_driverdriver;
与device一致,应用程序通过driver_register(&
platform_driver->
driver)向内核中注册你当前的驱动,而内核不关心你封装成的结构,而内核搜索的方法还是同样的contain_of大法。
系统如何将这两者匹配上的?
而不会将iic的设备加载到spi的驱动上面?
不会将这个iic设备的驱动加载到那个iic设备上,设备和驱动之间是如何联系的?
总线,这就是总线的作用!
include/linux/device.h文件中有总线类型的定义。
structbus_type{
*name;
//busname
structbus_attribute
*bus_attrs;
structdevice_attribute
*dev_attrs;
structdriver_attribute
*drv_attrs;
int
(*match)(structdevice*dev,structdevice_driver*drv);
(*uevent)(structdevice*dev,char**envp,
intnum_envp,char*buffer,intbuffer_size);
(*probe)(structdevice*dev);
(*remove)(structdevice*dev);
void
(*shutdown)(structdevice*dev);
int(*suspend)(structdevice*dev,pm_message_tstate);
int(*suspend_late)(structdevice*dev,pm_message_tstate);
int(*resume_early)(structdevice*dev);
int(*resume)(structdevice*dev);
这个总线设备中最重要的可能是match成员,由于我们一般很少去建立一个新的总线,所以我们很少涉及总线的编程,我们就只关注我们所关注的。
总线如何将两者关联起来,热插拔大家知道吧,当一个设备被通过device_register注册到内核中时,会导致一个热插拔事件产生,系统会遍历该总线(此总线是structdevice{bus_type*bus}注册时指明的bus)上的所有驱动程序,调用bus的match算法,来寻找与该设备相匹配的驱动程序,当一个驱动注册到内核的时候,处理过程与此相似,而一般的macth算法都比较简单,例如platform_bus的匹配算法就很简单,就是比较platform_device和platform_driver的name成员,如果匹配成功,就加载相应的设备或者驱动!
这就完成了一个连接的过程。
。
那么这两种设备驱动中最重要的类型在linux中如何表现出来,那我们就有必要介绍一下从2.6开始实现的sys文件系统了
我们intOctifspidevice
-
/sys/bus$cat/etc/fstab
proc
/proc
defaults
0
devpts
/dev/pts
devptsdefaults
00
tmpfs
/dev/shm
tmpfsdefaults
0
0
sysfs
/sys
sysfs
/dev/mtdblock2/mnt/flash2
yaffs
加载这个文件系统对于我们分析设备模型是非常有好处的。
sys文件夹下一般有如下的目录:
/sys$ls-al
drwxr-xr-x
10root
root
0Jan11970.
drwxrwxrwx
111000
tao
4096May2206:
56..
7root
0Oct2714:
09block
8root
0Jan11970bus
21root
0Jan11970class
4root
0Jan11970devices
2root
0Jan11970firmware
0Jan11970fs
0Jan11970kernel
22root
10module
block是由于历史原因形成的block设备的文件夹。
我们关心的是bus文件夹。
我们以spi设备为例:
spi部分要包括两种设备,一种是platform_device,一种是spi_device。
在arch/arm/mach-at91/at91sam9260_device.c文件中,定义的SPI硬件控制模块设备,这我们不需要关心。
还有一种是spi_device,定义在arch/arm/mach-at91/board-sam9260ek.c文件中,这就是我们的dataflash和mcp2515设备,
所以如何设备加载成功的话,在bus下面的每个目录里面,都存在devices和drivers两个文件夹,分别对应设备和文件。
/sys/bus/platform/devices$ls-al
0Oct2716:
01.
0Jan11970..
lrwxrwxrwx
1root
01at91_i2c->
../../../devices/platform/at91_i2c
01at91_nand->
../../../devices/platform/at91_nand
01at91_ohci->
../../../devices/platform/at91_ohci
01atmel_spi.0->
../../../devices/platform/atmel_spi.0
01atmel_spi.1->
../../../devices/platform/atmel_spi.1
01atmel_usart.0->
../../../devices/platform/atmel_usart.0
01atmel_usart.1->
../../../devices/platform/atmel_usart.1
01atmel_usart.2->
../../../devices/platform/atmel_usart.2
01macb->
../../../devices/platform/macb
驱动
/sys/bus/platform/drivers/atmel_spi$ls-al
10atmel_spi.0->
../../../../devices/platform/atmel_spi.0
10atmel_spi.1->
../../../../devices/platform/atmel_spi.1
--w-------
4096Oct2716:
10bind
10unbind
如果出现上面的这个情况,说明你的设备(两路spi总线)和驱动都加载成功了,如果你的devices下面没有spi.0设备和spi.1设备的话,说明
board-sam9260ek.c文件中的这个函数出错:
staticvoid__initek_board_init(void)
{
/*Serial*/
at91_add_device_serial();
/*USBHost*/
at91_add_device_usbh(&
ek_usbh_data);
/*USBDevice*/
at91_add_device_udc(&
ek_udc_data);
/*SPI*/
at91_add_device_spi(ek_spi_devices,ARRAY_SIZE(ek_spi_devices));
/*NAND*/
at91_add_device_nand(&
ek_nand_data);
/*Ethernet*/
at91_add_device_eth(&
ek_macb_data);
/*MMC*/
at91_add_device_mmc(0,&
ek_mmc_data);
/*I2C*/
at91_add_device_i2c();
}
这里是设备注册的地方,我们还应该在下面这个目录下看到这两个文件。
/sys/bus/spi/devices$ls-al
09.
09spi0.1->
../../../devices/platform/atmel_spi.0/spi0.1
09spi1.0->
../../../devices/platform/atmel_spi.1/spi1.0
这两个链接说明我们的两个spi设备注册都被接受了,剩下来就是驱动的问题。
有人看不懂这个sys文件系统的层次关系,其实这里比较好说明,就是spi0.1是atmel_spi.0设备的子设备嘛,很好理解的。
驱动:
platform_driver驱动:
/sys/bus/platform/drivers$ls-al
0Jan11970at91_i2c
0Jan11970at91_nand
0Jan11970at91_ohci
10atmel_spi
0Jan11970atmel_usart
0Jan11970macb
我们可以看到这个驱动只有一个atmel_spi,这个驱动是在哪加载的?
driver/spi/atmel_spi.c文件加载的。
spi_driver驱动:
/sys/bus/spi/drivers$ls-al
10.
10mcp2515
09mtd_dataflash
这是我们加载的两个驱动,说明驱动也加载正常了。
下面我们来说说我们遇到的问题吧。
在设备和驱动都加载正常之后,出现与dataflash设备通信不上的情况,驱动加载的时候,读取芯片的状态字读出是0xff,说明工作不正常,动用逻辑分析仪监控spi总线的通信,意外的发现,sck信号和cs信号正常,但是mosi无信号输出,开始觉得可能是spi总线适配器有问题,后来仔细观察原理图之后,发现dataflash和mmc/sd是使用同样的io口的,即pa0,pa1,pa2,而我的内核配置中打开了对mmc的支持,所以导致mosi不正常,所以可能9260的mmc与dataflash不能同时使用,但9263的可以。
解决办法:
makemenuconfig
DeviceDrivers--->
MMC/SDcardsupport,取消其支持,问题解决!
昨天其实还有一个问题可能大家没有注意到,没有解释清楚,其实是有问题的,我们的at91_add_device_spi函数如下:
staticstructspi_board_infoek_spi_devices[]={
#if!
defined(CONFIG_MMC_AT91)
{
/*DataFlashchip*/
.modalias
=\"
mtd_dataflash\"
.chip_select
=1,
.max_speed_hz
=15*1000*1000,
.bus_num
=0,
},
#ifdefined(CONFIG_MTD_AT91_DATAFLASH_CARD)
/*DataFlashcard*/
#endif
#ifdefined(CONFIG_SND_AT73C213)||defined(CONFIG_SND_AT73C213_MODULE)
/*AT73C213DAC*/
at73c213\"
=10*1000*1000,
/*spican,addbymrz*/
#ifdefined(CONFIG_CAN_MCP2515_MODULE)||defined(CONFIG_CAN_MCP2515)
//defined(CONFIG_CAN_MCP2515)
.modalias=\"
mcp2515\"
.chip_select=0,
//
.controller_data=AT91_PIN_PB3,
.irq=AT91_PIN_PC6,//AT91SAM9260_ID_IRQ0,
.platform_data=&
mcp251x_data,
.max_speed_hz=10*1000*1000,
.bus_num=1,
.mode=0,
/*
.chip_select=1,
.controller_data=AT91_PIN_PC5,
.irq=AT91_PIN_PC7,//AT91SAM9260_ID_IRQ1,
*/
#elifdefined(CONFIG_CAN_MCP251X)
mcp251x\"
void__initat91_add_device_spi(structspi_board_info*devices,intnr_devices)
inti;
unsignedlongcs_pin;
shortenable_spi0=0;
shortenable_spi1=0;
/*ChooseSPIchip-selects*/
/*这里加载我们定义的spi_board_info结构体,也就是两个spi设备的信息,注意,他们
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- spi driver