您的位置:首页 > 运维架构 > Linux

linux SPI驱动——gpio模拟spi驱动(三)

2016-11-03 11:06 393 查看
一:首先在我的平台注册platform_device,保证能让spi-gpio.c能执行到probe函数。
structspi_gpio_platform_data{
unsignedsck;
unsignedmosi;
unsignedmiso;
u16num_chipselect;
};

//#defineNCSGPIO_PB(2)//定义SS所对应的GPIO接口编号
[code]//#defineSCLKGPIO_PB(0)//定义SCLK所对应的GPIO接口编号
//#defineMOSIGPIO_PB(4)//定义SCLK所对应的GPIO接口编号
//#defineMISOGPIO_PB(1)
staticstructspi_gpio_platform_datajz_spi_gpio_data={
.sck=GPIO_PB(0),//GPIO_SPI_SCK,
.mosi=GPIO_PB(4),//GPIO_SPI_MOSI,
.miso=GPIO_PB(1),//GPIO_SPI_MISO,
.num_chipselect=1,
};
structplatform_devicejz_spi_gpio_device={
.name="spi_gpio",
.id=0,
.dev={
.platform_data=&jz_spi_gpio_data,
},
};

.csharpcode,.csharpcodepre{font-size:small;color:black;font-family:consolas,"CourierNew",courier,monospace;background-color:#ffffff}
.csharpcodepre{margin:0em}
.csharpcode.rem{color:#008000}
.csharpcode.kwrd{color:#0000ff}
.csharpcode.str{color:#006080}
.csharpcode.op{color:#0000c0}
.csharpcode.preproc{color:#cc6633}
.csharpcode.asp{background-color:#ffff00}
.csharpcode.html{color:#800000}
.csharpcode.attr{color:#ff0000}
.csharpcode.alt{background-color:#f4f4f4;width:100%;margin:0em}
.csharpcode.lnum{color:#606060}
注册platformdevice
platform_device_register(&jz_spi_gpio_device);
二:注册platform_driver在spi_gpio.c里面注册platformdriver
[code]MODULE_ALIAS("platform:"DRIVER_NAME);
staticstructplatform_driverspi_gpio_driver={
.driver.name=DRIVER_NAME,
.driver.owner=THIS_MODULE,
.remove=__exit_p(spi_gpio_remove),
};
staticint__initspi_gpio_init(void)
{
returnplatform_driver_probe(&spi_gpio_driver,spi_gpio_probe);
}
module_init(spi_gpio_init);
staticvoid__exitspi_gpio_exit(void)
{
platform_driver_unregister(&spi_gpio_driver);
}
module_exit(spi_gpio_exit);
MODULE_DESCRIPTION("SPImasterdriverusinggenericbitbangedGPIO");
MODULE_AUTHOR("DavidBrownell");
MODULE_LICENSE("GPL");

.csharpcode,.csharpcodepre{font-size:small;color:black;font-family:consolas,"CourierNew",courier,monospace;background-color:#ffffff}
.csharpcodepre{margin:0em}
.csharpcode.rem{color:#008000}
.csharpcode.kwrd{color:#0000ff}
.csharpcode.str{color:#006080}
.csharpcode.op{color:#0000c0}
.csharpcode.preproc{color:#cc6633}
.csharpcode.asp{background-color:#ffff00}
.csharpcode.html{color:#800000}
.csharpcode.attr{color:#ff0000}
.csharpcode.alt{background-color:#f4f4f4;width:100%;margin:0em}
.csharpcode.lnum{color:#606060}
.csharpcode,.csharpcodepre{font-size:small;color:black;font-family:consolas,"CourierNew",courier,monospace;background-color:#ffffff}
.csharpcodepre{margin:0em}
.csharpcode.rem{color:#008000}
.csharpcode.kwrd{color:#0000ff}
.csharpcode.str{color:#006080}
.csharpcode.op{color:#0000c0}
.csharpcode.preproc{color:#cc6633}
.csharpcode.asp{background-color:#ffff00}
.csharpcode.html{color:#800000}
.csharpcode.attr{color:#ff0000}
.csharpcode.alt{background-color:#f4f4f4;width:100%;margin:0em}
.csharpcode.lnum{color:#606060}.csharpcode,.csharpcodepre{font-size:small;color:black;font-family:consolas,"CourierNew",courier,monospace;background-color:#ffffff}
.csharpcodepre{margin:0em}
.csharpcode.rem{color:#008000}
.csharpcode.kwrd{color:#0000ff}
.csharpcode.str{color:#006080}
.csharpcode.op{color:#0000c0}
.csharpcode.preproc{color:#cc6633}
.csharpcode.asp{background-color:#ffff00}
.csharpcode.html{color:#800000}
.csharpcode.attr{color:#ff0000}
.csharpcode.alt{background-color:#f4f4f4;width:100%;margin:0em}
.csharpcode.lnum{color:#606060}.csharpcode,.csharpcodepre{font-size:small;color:black;font-family:consolas,"CourierNew",courier,monospace;background-color:#ffffff}
.csharpcodepre{margin:0em}
.csharpcode.rem{color:#008000}
.csharpcode.kwrd{color:#0000ff}
.csharpcode.str{color:#006080}
.csharpcode.op{color:#0000c0}
.csharpcode.preproc{color:#cc6633}
.csharpcode.asp{background-color:#ffff00}
.csharpcode.html{color:#800000}
.csharpcode.attr{color:#ff0000}
.csharpcode.alt{background-color:#f4f4f4;width:100%;margin:0em}
.csharpcode.lnum{color:#606060}三:具体算法分析
structspi_gpio{
structspi_bitbangbitbang;/*gpio模拟spi算法相关的结构*/
structspi_gpio_platform_datapdata;/*spiplatformdata对应模拟spi的四个gpio编号*/
structplatform_device*pdev;/*对应注册的platformdevice*/
};

staticint__initspi_gpio_probe(structplatform_device*pdev)
{
intstatus;
structspi_master*master;
structspi_gpio*spi_gpio;
structspi_gpio_platform_data*pdata;
u16master_flags=0;
pdata=pdev->dev.platform_data;/*存放spi的四根gpio*/
#ifdefGENERIC_BITBANG
if(!pdata||!pdata->num_chipselect)
return-ENODEV;
#endif
/*申请注册四个gpio*/
status=spi_gpio_request(pdata,dev_name(&pdev->dev),&master_flags);
if(status<0){
returnstatus;
}
/*allocaspimaster,master->dev->p->driver_data=&master[1]*/
master=spi_alloc_master(&pdev->dev,sizeof*spi_gpio);
if(!master){
status=-ENOMEM;
gotogpio_free;
}
/*spi_gpio指向一块空间,即指向mstaer[1]
pdev->dev->p->driver_data=spi_gpio;
初始化spi_gpio
*/
spi_gpio=spi_master_get_devdata(master);
platform_set_drvdata(pdev,spi_gpio);
spi_gpio->pdev=pdev;
if(pdata)
spi_gpio->pdata=*pdata;
master->flags=master_flags;
master->bus_num=pdev->id;
master->num_chipselect=SPI_N_CHIPSEL;
master->setup=spi_gpio_setup;/*setup比如cs引脚申请*/
master->cleanup=spi_gpio_cleanup;
/*spi_gpio->bitbang.master=master*/
spi_gpio->bitbang.master=spi_master_get(master);
spi_gpio->bitbang.chipselect=spi_gpio_chipselect;
/*spi_gpio->bitbang.txrx_word数组函数四个元素指针,分别指向spi四种mode算法函数*/
if((master_flags&(SPI_MASTER_NO_TX|SPI_MASTER_NO_RX))==0){
spi_gpio->bitbang.txrx_word[SPI_MODE_0]=spi_gpio_txrx_word_mode0;
spi_gpio->bitbang.txrx_word[SPI_MODE_1]=spi_gpio_txrx_word_mode1;
spi_gpio->bitbang.txrx_word[SPI_MODE_2]=spi_gpio_txrx_word_mode2;
spi_gpio->bitbang.txrx_word[SPI_MODE_3]=spi_gpio_txrx_word_mode3;
}else{
spi_gpio->bitbang.txrx_word[SPI_MODE_0]=spi_gpio_spec_txrx_word_mode0;
spi_gpio->bitbang.txrx_word[SPI_MODE_1]=spi_gpio_spec_txrx_word_mode1;
spi_gpio->bitbang.txrx_word[SPI_MODE_2]=spi_gpio_spec_txrx_word_mode2;
spi_gpio->bitbang.txrx_word[SPI_MODE_3]=spi_gpio_spec_txrx_word_mode3;
}
/*spi_gpio->bitbang.setup_transfer初始化传输的bits_per_word和speed*/
spi_gpio->bitbang.setup_transfer=spi_bitbang_setup_transfer;
spi_gpio->bitbang.flags=SPI_CS_HIGH;
/*spi_gpio->bitbang相关算法接口初始化*/
status=spi_bitbang_start(&spi_gpio->bitbang);
if(status<0){
spi_master_put(spi_gpio->bitbang.master);
gpio_free:
if(SPI_MISO_GPIO!=SPI_GPIO_NO_MISO)
gpio_free(SPI_MISO_GPIO);
if(SPI_MOSI_GPIO!=SPI_GPIO_NO_MOSI)
gpio_free(SPI_MOSI_GPIO);
gpio_free(SPI_SCK_GPIO);
spi_master_put(master);
}
returnstatus;
}

.csharpcode,.csharpcodepre{font-size:small;color:black;font-family:consolas,"CourierNew",courier,monospace;background-color:#ffffff}
.csharpcodepre{margin:0em}
.csharpcode.rem{color:#008000}
.csharpcode.kwrd{color:#0000ff}
.csharpcode.str{color:#006080}
.csharpcode.op{color:#0000c0}
.csharpcode.preproc{color:#cc6633}
.csharpcode.asp{background-color:#ffff00}
.csharpcode.html{color:#800000}
.csharpcode.attr{color:#ff0000}
.csharpcode.alt{background-color:#f4f4f4;width:100%;margin:0em}
.csharpcode.lnum{color:#606060}
.csharpcode,.csharpcodepre{font-size:small;color:black;font-family:consolas,"CourierNew",courier,monospace;background-color:#ffffff}
.csharpcodepre{margin:0em}
.csharpcode.rem{color:#008000}
.csharpcode.kwrd{color:#0000ff}
.csharpcode.str{color:#006080}
.csharpcode.op{color:#0000c0}
.csharpcode.preproc{color:#cc6633}
.csharpcode.asp{background-color:#ffff00}
.csharpcode.html{color:#800000}
.csharpcode.attr{color:#ff0000}
.csharpcode.alt{background-color:#f4f4f4;width:100%;margin:0em}
.csharpcode.lnum{color:#606060}
四:总之最终让spi_gpi0整个对象存放了整个gpio模拟spi的算法结构;而pdev->dev->p->driver_data=spi_gpio;
platformdevice和platformdriver两者match结果是:
root@CarRadio:/#ls/sys/bus/platform/devices/spi_gpio.0/
drivermodaliaspowerspi0.0spi_mastersubsystemuevent
root@CarRadio:/#ls/sys/bus/platform/devices/spi_gpio.0/driver/
spi_gpio.0uevent.csharpcode,.csharpcodepre{font-size:small;color:black;font-family:consolas,"CourierNew",courier,monospace;background-color:#ffffff}
.csharpcodepre{margin:0em}
.csharpcode.rem{color:#008000}
.csharpcode.kwrd{color:#0000ff}
.csharpcode.str{color:#006080}
.csharpcode.op{color:#0000c0}
.csharpcode.preproc{color:#cc6633}
.csharpcode.asp{background-color:#ffff00}
.csharpcode.html{color:#800000}
.csharpcode.attr{color:#ff0000}
.csharpcode.alt{background-color:#f4f4f4;width:100%;margin:0em}
.csharpcode.lnum{color:#606060}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: