【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

对于linux驱动来说,一般的架构还是按照bus-host-device的形式来进行的。比如就拿usb来说,通常如果是新的soc,只需要适配一下host就可以了。但是如果要适配其他的usb外接设备,那么需要自己编写device driver。同样,目前pc用到最多的还是pcie,所以你会发现pc上编写的driver大多数都是适配不同功能类型的device driver。然而,对于soc来说,它应该怎么处理?其实,linux已经为我们想出了办法,那就是platform bus。platform是一个虚拟总线,要使用它,只需要两步就可以。这里,不妨以mini2440常用的dm9000网卡举例说明。

1、注册dm9000设备

对于bus设备,一般如果device上线了,那么driver会自动加载。但是platform bus是一个假的总线,所以不可能自动加载。这个时候,系统就需要我们手动添加设备,这样后续也可以实现自动加载driver了。因此在arch/arm/mach-s3c24xx/mach-mini2440.c就存在这么一段代码,

static struct platform_device mini2440_device_eth = {.name      = "dm9000",.id       = -1,.num_resources    = ARRAY_SIZE(mini2440_dm9k_resource),.resource = mini2440_dm9k_resource,.dev      = {.platform_data  = &mini2440_dm9k_pdata,},
};

2、编写dm9000驱动,这段代码位于drivers/net/ethernet/davicom/dm9000.c

只要dm9000被注册,那么这里的驱动就会被加载。

static struct platform_driver dm9000_driver = {.driver  = {.name    = "dm9000",.pm   = &dm9000_drv_pm_ops,.of_match_table = of_match_ptr(dm9000_of_matches),},.probe   = dm9000_probe,.remove  = dm9000_drv_remove,
};

由于之前dm9000设备已经注册,那么在insmod dm9000.ko的时候,代码会一直执行下去。因为linux会在注册dm9000驱动之时,发现当前正好有一个dm9000的设备,所以会直接调用probe函数。当然在probe函数里面,它还会注册dm9000_netdev_ops结构、通过request_irq注册中断,基本的驱动结构基本上就是这样的。

3、mini2440的其他设备驱动

有了dm9000的范例,你会发现soc上的大部分驱动默不是用这种方法完成的,这大概也是soc特有的一种的驱动方式吧。

比如gpio驱动,

static struct platform_device mini2440_button_device = {.name       = "gpio-keys",.id        = -1,.dev      = {.platform_data  = &mini2440_button_data,}
};

比如led驱动,

static struct platform_device mini2440_led1 = {.name        = "s3c24xx_led",.id      = 1,.dev       = {.platform_data  = &mini2440_led1_pdata,},
};static struct platform_device mini2440_led2 = {.name     = "s3c24xx_led",.id      = 2,.dev       = {.platform_data  = &mini2440_led2_pdata,},
};static struct platform_device mini2440_led3 = {.name     = "s3c24xx_led",.id      = 3,.dev       = {.platform_data  = &mini2440_led3_pdata,},
};static struct platform_device mini2440_led4 = {.name     = "s3c24xx_led",.id      = 4,.dev       = {.platform_data  = &mini2440_led4_pdata,},
};static struct platform_device mini2440_led_backlight = {.name        = "s3c24xx_led",.id      = 5,.dev       = {.platform_data  = &mini2440_led_backlight_pdata,},
};

比如声卡驱动,

static struct platform_device mini2440_audio = {.name       = "s3c24xx_uda134x",.id      = 0,.dev       = {.platform_data  = &mini2440_audio_pins,},
};

如果需要看所有的platform设备注册情况,只需要看这个结构体就可以了。

static struct platform_device *mini2440_devices[] __initdata = {&s3c_device_ohci,&s3c_device_wdt,&s3c_device_i2c0,&s3c_device_rtc,&s3c_device_usbgadget,&mini2440_device_eth,&mini2440_led1,&mini2440_led2,&mini2440_led3,&mini2440_led4,&mini2440_button_device,&s3c_device_nand,&s3c_device_sdi,&s3c2440_device_dma,&s3c_device_iis,&uda1340_codec,&mini2440_audio,
};

soc的驱动流程远没有大家想象的那么复杂,建议大家循着这个脉络慢慢学,总能找到适合自己的学习方法。

ps:

有同学可能好奇,这么多驱动都在,怎么没有dram和pll呢?其实这两个呢,一般在uboot里面就配置好了,不再修改了。

linux驱动编写(platform总线和网卡驱动)相关推荐

  1. Linux I2C核心、总线与设备驱动

    Linux I2C核心.总线与设备驱动 I2C总线仅仅使用SCL. SDA这两根信号线就实现了设备之间的数据交互,极大地简化了对硬件资源和PCB板布线空间的占用.因此, I2C总线非常广泛地应用在EE ...

  2. 嵌入式Linux——网卡驱动(1):网卡驱动框架介绍

    声明:文本是看完韦东山老师的视频和看了一些文章后,所写的总结.我会尽力将自己所了解的知识写出来,但由于自己感觉并没有学的很好,所以文中可能有错的地方敬请指出,谢谢. 在介绍本文之前,我想先对前面的知识 ...

  3. linux 内核 网卡驱动 移植,linux内核移植步骤添加dm9000网卡驱动(设备树).docx

    linux内核移植步骤添加dm9000网卡驱动(设备树).docx LINUX内核移植步骤2015年05月13日星期三上午1105往设备树中添加网卡驱动1.选平台,指定交叉编译工具链1.在MAKEFI ...

  4. linux debian/ubuntu RTL8111/8168/8411网卡驱动怎么正确安装?

    linux debian/ubuntu RTL8111/8168/8411网卡驱动怎么正确安装? 1.下载驱动 或者云盘链接 链接: https://pan.baidu.com/s/1B0USXWRp ...

  5. 台式计算机用什么网卡,台式机怎样安装网卡驱动,教您电脑安装网卡驱动

    电脑存在的第一大意义是什么?没错,就是上网,如果电脑没有了网络了,我们该怎么去解决呢?首先得去检查原因,是病毒的,就杀毒,如果是没有正确安装网卡驱动就去安装,但是出于网友对安装网卡驱动不知道如何操作, ...

  6. html安装网卡驱动,网卡驱动怎么装,教您网卡驱动怎么安装

    装完系统后一般需要安装一些硬件驱动,说的简单点,电脑要上网就要有网卡,而要让网卡发挥作用就要有网卡驱动,就比如汽车要有汽油才能跑一样的,没有了驱动,网卡就发挥不了作用.那么网卡驱动怎么安装?下面,小编 ...

  7. Linux I2C核心、总线与设备驱动(二)

    从上面的分析可知,虽然I2C硬件体系结构比较简单,但是I2C体系结构在Linux中的实现却相当复杂.当工程师拿到实际的电路板,面对复杂的 Linux I2C子系统,应该如何下手写驱动呢?究竟有哪些是需 ...

  8. Linux内核分析 - 网络[二]:网卡驱动接收报文

    纠结了好多天,终于弄懂了B440X的处理. 上篇讲到通过中断,最终网卡调用了b44_rx()来接收报文 对这个函数中的一些参数,可以这样理解: bp->rx_cons – 处理器处理到的缓冲区号 ...

  9. linux网卡驱动离线安装_Linux下网卡驱动的安装

    //Linux下网卡驱动的安装 //从intel网站上下载下来的Linux驱动是e1000-5.2.52.tar.gz rpm -qa|grep kernel- //source查看是否安装了这个包, ...

最新文章

  1. Symantec:揭秘Hidden Lynx组织的APT***行动
  2. 马斯克的星际飞船首次起飞测试成功!起跳150米后平稳着陆,“火星在望”
  3. 安卓4.2原生rom状态栏显示运营商
  4. 通过NRM随意切换Taobao镜像和NPM官方镜像
  5. Java关键字synchronized的简单理解
  6. 防火墙的数据包拦截方式
  7. 安兔兔跑分可信吗_安兔兔跑分能信吗?手机性能与跑分关系分析,说点你不知道的!...
  8. Style之flag标签
  9. 西电大学计算机专硕,2021西安电子科技大学计算机专硕考研成功经验分享
  10. 黑马程序员Java零基础视频教程(2022最新Java)B站视频学习笔记-Day13-面向对象进阶01
  11. ps中海报设计的设计思路
  12. 更聪明的免费图片素材搜素引擎 Everypixel 用 AI 排除俗气照片
  13. 三年级下册计算机全册教案,小学三年级下册信息技术教案三篇
  14. [18调剂]江西理工大学2018年研究生招生预调剂公告
  15. windows系统垃圾清理的批处理代码
  16. 软件常用通信协议模板
  17. 香蕉派安装64位linux,快速上手 香蕉派镜像烧录与系统启动
  18. 成为 java架构师的书籍推荐
  19. eclipse32位安装教程_AutoCAD 2018 64位简体中文安装教程
  20. 量化学习 | 统计套利 Review and Outlook(收藏)

热门文章

  1. iOS核心动画高级技术(九) 图层时间
  2. iOS 入门——Hello World app
  3. ribbon重试机制
  4. Phinx - 数据库迁移及版本控制介绍(内含中文文档翻译)
  5. 原生的文件上傳和下载
  6. C# WinForm WebBrowser (三) 编辑模式
  7. 拒绝病毒威胁 为U盘请个“保护神”
  8. 将Linux作为桌面操作系统,你准备好了吗?
  9. mfc实现播放器功能,双击全屏,再双击还原
  10. OpenXml开发-向Excel2007文档中添加数据