当前位置:首页 > 单片机 > 单片机
[导读]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

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

特朗普集团近日取消了其新推出的T1智能手机“将在美国制造”的宣传标语,此举源于外界对这款手机能否以当前定价在美国本土生产的质疑。

关键字: 特朗普 苹果 AI

美国总统特朗普在公开场合表示,他已要求苹果公司CEO蒂姆·库克停止在印度建厂,矛头直指该公司生产多元化的计划。

关键字: 特朗普 苹果 AI

4月10日消息,据媒体报道,美国总统特朗普宣布,美国对部分贸易伙伴暂停90天执行新关税政策,同时对中国的关税提高到125%,该消息公布后苹果股价飙升了15%。这次反弹使苹果市值增加了4000多亿美元,目前苹果市值接近3万...

关键字: 特朗普 AI 人工智能 特斯拉

3月25日消息,据报道,当地时间3月20日,美国总统特朗普在社交媒体平台“真实社交”上发文写道:“那些被抓到破坏特斯拉的人,将有很大可能被判入狱长达20年,这包括资助(破坏特斯拉汽车)者,我们正在寻找你。”

关键字: 特朗普 AI 人工智能 特斯拉

1月22日消息,刚刚,新任美国总统特朗普放出重磅消息,将全力支持美国AI发展。

关键字: 特朗普 AI 人工智能

特朗普先生有两件事一定会载入史册,一个是筑墙,一个是挖坑。在美墨边境筑墙的口号确保边境安全,降低因非法移民引起的犯罪率过高问题;在中美科技产业之间挖坑的口号也是安全,美国企业不得使用对美国国家安全构成威胁的电信设备,总统...

关键字: 特朗普 孤立主义 科技产业

据路透社1月17日消息显示,知情人士透露,特朗普已通知英特尔、铠侠在内的几家华为供应商,将要撤销其对华为的出货的部分许可证,同时将拒绝其他数十个向华为供货的申请。据透露,共有4家公司的8份许可被撤销。另外,相关公司收到撤...

关键字: 华为 芯片 特朗普

曾在2018年时被美国总统特朗普称作“世界第八奇迹”的富士康集团在美国威斯康星州投资建设的LCD显示屏工厂项目,如今却因为富士康将项目大幅缩水并拒绝签订新的合同而陷入了僵局。这也导致富士康无法从当地政府那里获得约40亿美...

关键字: 特朗普 富士康

今年5月,因自己发布的推文被贴上“无确凿依据”标签而与推特发生激烈争执后,美国总统特朗普签署了一项行政令,下令要求重审《通信规范法》第230条。

关键字: 谷歌 facebook 特朗普

众所周知,寄往白宫的所有邮件在到达白宫之前都会在他地进行分类和筛选。9月19日,根据美国相关执法官员的通报,本周早些时候,执法人员截获了一个寄给特朗普总统的包裹,该包裹内包含蓖麻毒蛋白。

关键字: 美国 白宫 特朗普
关闭