linux下smi总线驱动

linux下smi总线驱动

ID:1248912

大小:222.13 KB

页数:10页

时间:2017-11-09

linux下smi总线驱动_第1页
linux下smi总线驱动_第2页
linux下smi总线驱动_第3页
linux下smi总线驱动_第4页
linux下smi总线驱动_第5页
资源描述:

《linux下smi总线驱动》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、Linux下SMI总线驱动韩大卫@吉林师范大学剖析某类总线接口的芯片在linux里用户层对其的调用办法,较快捷的办法是直接找到该总线控制器的驱动程序,从其提供的软件接口展开逐层向上推及。现跟大家分享一下linux下octeon处理器的SMI总线控制器的驱动(其架构完全符合platform设备驱动的通过架构)。附录里有用户层访问SMI总线设备,如marvellPHY芯片88E1111/1340/1340S的源程序。下面为caviumocteon的SMI总线驱动源代码的大致内容:drivers/net/phy/mdio-octeon.cstaticint__initocteon_

2、mdiobus_mod_init(void){//将octeon_mdiobus_driver作为一个platform类型的driver注册到内核returnplatform_driver_register(&octeon_mdiobus_driver);}module_init(octeon_mdiobus_mod_init);staticstructplatform_driverocteon_mdiobus_driver={.driver={.name="mdio-octeon",.owner=THIS_MODULE,.of_match_table=octeon_mdio

3、bus_match,},.probe=octeon_mdiobus_probe,.remove=__exit_p(octeon_mdiobus_remove),};staticint__initocteon_mdiobus_probe(structplatform_device*pdev){structocteon_mdiobus*bus;structresource*res_mem;unioncvmx_smix_ensmi_en;interr=-ENOENT;//申请并初始化一段内存填充数据结构structocteon_mdiobusbus=devm_kzalloc(&pd

4、ev->dev,sizeof(*bus),GFP_KERNEL);if(!bus)return-ENOMEM;/*获取IO内存资源的描述,这个资料描述是uboot通过读取解析并处理uboot里的dts文件后得到的,在linux启动后,便可通过platform_get_resource()来获取,成功获取后,后面会向内核申请使用这段IO内存,另外,dts文件关于IO地址等资料的描述是按照CPUdatasheet上的信息来写的。*/res_mem=platform_get_resource(pdev,IORESOURCE_MEM,0);if(res_mem==NULL){dev_

5、err(&pdev->dev,"foundnomemoryresource");err=-ENXIO;gotofail_region;}/*通过res_mem来得到地址首地址和地址长度,这个start是我在uboot的dts文件里描述的“smi0:mdio@1180000001800{compatible="cavium,octeon-3860-mdio";#address-cells=<1>;#size-cells=<0>;reg=<0x118000x000018000x00x40>;“首地址0x1180000001800,长度为0x40/*bus->mdio_phys

6、=res_mem->start;bus->regsize=resource_size(res_mem);/*将bus->mdio_phys,regsize打印出来分别为:0x1800和0x40*///调用include/linux/ioport.h里提供的API向内核申请使用这段IO内存if(!devm_request_mem_region(&pdev->dev,bus->mdio_phys,bus->regsize,res_mem->name)){dev_err(&pdev->dev,"request_mem_regionfailed");gotofail_region

7、;}//将这段IO内存映射为内存地址,此时的register_base即可被内核空间直接使用bus->register_base=(u64)ioremap(bus->mdio_phys,bus->regsize);/*将bus->register_base打印出来为0x1800,但是这个地址是存在内存中的,上面的bus->mdio_phys的0x1800是存在于IO内存中的*///mdiobus_alloc()封装了kzalloc,作用是申请一段大小为sizeof(structmii_bus)的内存bu

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。