当前位置:首页 > 单片机 > 单片机
[导读]1. 配置内核首先,修改arch/arm/plat-s3c24xx/Kconfig,这一步的目的是为了可以在内核中使能SPI0的配置函数。修改后的内容如下:config S3C24XX_SPI_BUS0_GPE11_GPE12_GPE13 bool " S3C24XX_SPI_BUS0_GPE11_GPE12_GP

1. 配置内核

首先,修改arch/arm/plat-s3c24xx/Kconfig,这一步的目的是为了可以在内核中使能SPI0的配置函数。

修改后的内容如下:

config S3C24XX_SPI_BUS0_GPE11_GPE12_GPE13
bool " S3C24XX_SPI_BUS0_GPE11_GPE12_GPE13"
help
SPI GPIO configuration code for BUS0 when connected to
GPE11, GPE12 and GPE13.

接着配置内核,首先打开S3C24XX_SPI_BUS0_GPE11_GPE12_GPE13选项,这样编译的时候会将

arch/arm/plat-s3c24xx/spi-bus0-gpe11_12_13.c一起进行编译。

该源文件中的函数void s3c24xx_spi_gpiocfg_bus0_gpe11_12_13(struct s3c2410_spi_info *spi, int enable)将用于配置spi控制器0的管脚。



接着,使能SPI功能,这里打开2440的SPI控制器驱动和通用的protocol驱动spidev。


2. 修改源码

修改arch/arm/mach-s3c2440/mach-smdk2440.c

增加内容:

#include

#include

static struct s3c2410_spi_info s3c2410_spi0_platdata={

.pin_cs = S3C2410_GPG(2),

.num_cs = 1,

.bus_num = 0,

.gpio_setup =s3c24xx_spi_gpiocfg_bus0_gpe11_12_13,

};

static struct spi_board_info s3c2410_spi0_board[]={

[0] = {

.modalias = “spidev”,

.bus_num = 0,

.chip_select = 0,

.max_speed_hz = 500 * 1000,

},

};

在smdk2440_devices[]中增加

&s3c_device_spi0,

在smdk2440_mach_init函数中增加

s3c_device_spi0.dev.platform_data = &s3c2410_spi0_platdata;

spi_register_board_info(s3c2410_spi0_board,ARRAY_SIZE(s3c2410_spi0_board));

修改完毕以后,重新编译内核,并下载内核。查看下设备节点:

[root@yj423 /dev]#ls /dev/spidev0.0
/dev/spidev0.0


3.测试

用杜邦线将MOSI和MISO管脚相连。

在内核源码中提供了SPI测试程序。源码位于Documentation/spi/spidev_test.c,编译之后,下到开发板并执行。

[root@yj423 yj423]#./spidev_test -D /dev/spidev0.0
spi mode: 0
bits per word: 8
max speed: 500000 Hz (500 KHz)

FF FF FF FF FF FF
40 00 00 00 00 95
FF FF FF FF FF FF
FF FF FF FF FF FF
FF FF FF FF FF FF
DE AD BE EF BA AD
F0 0D
NOTE:如果你只是为了移植而移植,那么后面的内容就不要看了。想知道WHY,那请继续往下看。


4.原理

首先,在第二小结中我们看到定义了两个数据结构,之所以要定义那是因为驱动程序需要用到,详见

基于S3C2440的嵌入式Linux驱动——SPI子系统解读(二)

需要这两个数据结构的地方,均用红色字体说明了。

数据s3c2410_spi0_platdata是作为平台的私有数据,因此使用了s3c_device_spi0.dev.platform_data = &s3c2410_spi0_platdata来添加该数据。

而s3c2410_spi0_board必须通过函数spi_register_board_info添加到内核中,

最重要的一个问题,这些数据结构的值是怎么给出的?

先来看看这两个数据结构:


structspi_board_info{

/*thedevicenameandmodulenamearecoupled,likeplatform_bus;

*"modalias"isnormallythedrivername.

*

*platform_datagoestospi_device.dev.platform_data,

*controller_datagoestospi_device.controller_data,

*irqiscopiedtoo

*/

charmodalias[32];

constvoid*platform_data;

void*controller_data;

intirq;

/*slowersignalingonnoisyorlowvoltageboards*/

u32max_speed_hz;

/*bus_numisboardspecificandmatchesthebus_numofsome

*spi_masterthatwillprobablyberegisteredlater.

*

*chip_selectreflectshowthischipiswiredtothatmaster;

*it'slessthannum_chipselect.

*/

u16bus_num;

u16chip_select;

/*modebecomesspi_device.mode,andisessentialforchips

*wherethedefaultofSPI_CS_HIGH=0iswrong.

*/

u8mode;

/*...mayneedadditionalspi_devicechipconfigdatahere.

*avoidstuffprotocoldriverscanset;butincludestuff

*neededtobehavewithoutbeingboundtoadriver:

*-quirkslikeclockratematteringwhennotselected

*/

};

structs3c2410_spi_info{

intpin_cs;/*simplegpiocs*/

unsignedintnum_cs;/*totalchipselects*/

intbus_num;/*busnumbertouse.*/

void(*gpio_setup)(structs3c2410_spi_info*spi,intenable);

void(*set_cs)(structs3c2410_spi_info*spi,intcs,intpol);

};

4.1 s3c2410_spi_info


pin_cs:表示哪个管脚用输出片选信号,这里使用GPG2管脚,具体的管脚请参看你的datasheet。

bus_num:表示总线接口。这里使用0,表示使用SPI0控制器。S3C2440有两个SPI控制器,分别为SPI0和SPI1。

num_cs:表示该SPI控制器控制几个SPI从设备,这里为1,仅有一个设备。

s3c2410_spi_info作为平台数据,在s3c24xx_spi_probe函数中,bus_cs和bus_num将被复制给master中的相应字段。也就是说,该master为SPI0控制器,有1个从设备。

而pin_cs将由函数s3c24xx_spi_gpiocs使用,该函数使能片选信号。


staticvoids3c24xx_spi_gpiocs(structs3c2410_spi_info*spi,intcs,intpol)

{

gpio_set_value(spi->pin_cs,pol);

}

gpio_setup: 这里设置为函数s3c24xx_spi_gpiocfg_bus0_gpe11_12_13, 该函数用于初始化SPI控制器的管脚。

该函数将在主控制驱动的s3c24xx_spi_initialsetup函数中被调用:



4.2spi_board_info

首先,我们知道spi_board_info作为SPI设备的板级信息,在spi_new_device函数中将该板级信息全部复制给spi_device。

modalias:将用于绑定驱动和设备。我们看下match方法:


staticintspi_match_device(structdevice*dev,structdevice_driver*drv)

{

conststructspi_device*spi=to_spi_device(dev);

returnstrcmp(spi->modalias,drv->name)==0;

}

而drv->name为在spi_driver中定义,如下



staticstructspi_driverspidev_spi={

.driver={

.name="spidev",

.owner=THIS_MODULE,

},

.probe=spidev_probe,

.remove=__devexit_p(spidev_remove),

/*NOTE:suspend/resumemethodsarenotnecessaryhere.

* We don't do anything except pass the

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭