当前位置:首页 > 单片机 > 单片机
[导读]本文属于第二部分。4. 主控制器驱动程序4.1 定义 platform device下列数据结构位于arch/arm/plat-s3c24XX/devs.c/*SPI(0)*/staticstructresources3c_spi0_resource[]={[0]={.start=S3C24XX_PA_SPI,.end=S3C24XX_PA_S

本文属于第二部分。

4. 主控制器驱动程序

4.1 定义 platform device

下列数据结构位于arch/arm/plat-s3c24XX/devs.c

/*SPI(0)*/

staticstructresources3c_spi0_resource[]={

[0]={

.start=S3C24XX_PA_SPI,

.end=S3C24XX_PA_SPI+0x1f,

.flags=IORESOURCE_MEM,

},

[1]={

.start=IRQ_SPI0,

.end=IRQ_SPI0,

.flags=IORESOURCE_IRQ,

}

};

staticu64s3c_device_spi0_dmamask=0xffffffffUL;

structplatform_devices3c_device_spi0={

.name="s3c2410-spi",

.id=0,

.num_resources=ARRAY_SIZE(s3c_spi0_resource),

.resource=s3c_spi0_resource,

.dev={

.dma_mask=&s3c_device_spi0_dmamask,

.coherent_dma_mask=0xffffffffUL

}

};

platform设备给出了spi0接口的寄存器地址资源以及IRQ资源。注意其设备名为s3c2410-spi。

4.2 定义platform driver

下列函数位于deivers/spi/s3c24xx.c。


MODULE_ALIAS("platform:s3c2410-spi");

staticstructplatform_drivers3c24xx_spi_driver={

.remove=__exit_p(s3c24xx_spi_remove),

.suspend=s3c24xx_spi_suspend,

.resume=s3c24xx_spi_resume,

.driver={

.name="s3c2410-spi",

.owner=THIS_MODULE,

},

};

staticint__inits3c24xx_spi_init(void)

{

returnplatform_driver_probe(&s3c24xx_spi_driver,s3c24xx_spi_probe);//设备不可热插拔,所以使用该函数,而不是platform_driver_register

}

staticvoid__exits3c24xx_spi_exit(void)

{

platform_driver_unregister(&s3c24xx_spi_driver);

}

module_init(s3c24xx_spi_init);

module_exit(s3c24xx_spi_exit);

调用了platform_driver_probe注册platform驱动,注册完成以后将会调用platform的s3c24xx_spi_probe函数。

NOTE:platform驱动的name和platform device的name是相同的。

4.2.1s3c24xx_spi_probe函数

下列函数位于deivers/spi/s3c24xx.c。


staticint__inits3c24xx_spi_probe(structplatform_device*pdev)

{

structs3c2410_spi_info*pdata;

structs3c24xx_spi*hw;

structspi_master*master;

structresource*res;

interr=0;

/*分配master结构体,其中包括s3c24xx_spi结构的内存空间,使用master.dev.driver_data指向它*/

master=spi_alloc_master(&pdev->dev,sizeof(structs3c24xx_spi));

if(master==NULL){

dev_err(&pdev->dev,"Nomemoryforspi_mastern");

err=-ENOMEM;

gotoerr_nomem;

}

/*获得s3c24xx_spi结构,并清0该结构*/

hw=spi_master_get_devdata(master);

memset(hw,0,sizeof(structs3c24xx_spi));

hw->master=spi_master_get(master);/*保存master结构体,同时增加引用计数*/

hw->pdata=pdata=pdev->dev.platform_data;/*获取s3c2410_spi_info结构体指针*/

hw->dev=&pdev->dev;/*保存platform设备的dev*/

if(pdata==NULL){

dev_err(&pdev->dev,"Noplatformdatasuppliedn");

err=-ENOENT;

gotoerr_no_pdata;

}

platform_set_drvdata(pdev,hw);/*让platform_devuce.dev.driver_data指向s3c24xx_spi*/

init_completion(&hw->done);/*初始化completion*/

/*setupthemasterstate.*//*填充master结构体的两个字段*/

master->num_chipselect=hw->pdata->num_cs;

master->bus_num=pdata->bus_num;

/*setupthestateforthebitbangdriver*//*填充bitbang字段*/

hw->bitbang.master=hw->master;

hw->bitbang.setup_transfer=s3c24xx_spi_setupxfer;

hw->bitbang.chipselect=s3c24xx_spi_chipsel;

hw->bitbang.txrx_bufs=s3c24xx_spi_txrx;

hw->bitbang.master->setup=s3c24xx_spi_setup;

dev_dbg(hw->dev,"bitbangat%pn",&hw->bitbang);

/*findandmapourresources*/

res=platform_get_resource(pdev,IORESOURCE_MEM,0);/*获取IO资源*/

if(res==NULL){

dev_err(&pdev->dev,"CannotgetIORESOURCE_MEMn");

err=-ENOENT;

gotoerr_no_iores;

}

hw->ioarea=request_mem_region(res->start,(res->end-res->start)+1,/*申请IO内存*/

pdev->name);

if(hw->ioarea==NULL){

dev_err(&pdev->dev,"Cannotreserveregionn");

err=-ENXIO;

gotoerr_no_iores;

}

hw->regs=ioremap(res->start,(res->end-res->start)+1);/*建立映射*/

if(hw->regs==NULL){

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

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭