linux驱动编写(platform总线和网卡驱动)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱: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总线和网卡驱动)相关推荐
- Linux I2C核心、总线与设备驱动
Linux I2C核心.总线与设备驱动 I2C总线仅仅使用SCL. SDA这两根信号线就实现了设备之间的数据交互,极大地简化了对硬件资源和PCB板布线空间的占用.因此, I2C总线非常广泛地应用在EE ...
- 嵌入式Linux——网卡驱动(1):网卡驱动框架介绍
声明:文本是看完韦东山老师的视频和看了一些文章后,所写的总结.我会尽力将自己所了解的知识写出来,但由于自己感觉并没有学的很好,所以文中可能有错的地方敬请指出,谢谢. 在介绍本文之前,我想先对前面的知识 ...
- linux 内核 网卡驱动 移植,linux内核移植步骤添加dm9000网卡驱动(设备树).docx
linux内核移植步骤添加dm9000网卡驱动(设备树).docx LINUX内核移植步骤2015年05月13日星期三上午1105往设备树中添加网卡驱动1.选平台,指定交叉编译工具链1.在MAKEFI ...
- linux debian/ubuntu RTL8111/8168/8411网卡驱动怎么正确安装?
linux debian/ubuntu RTL8111/8168/8411网卡驱动怎么正确安装? 1.下载驱动 或者云盘链接 链接: https://pan.baidu.com/s/1B0USXWRp ...
- 台式计算机用什么网卡,台式机怎样安装网卡驱动,教您电脑安装网卡驱动
电脑存在的第一大意义是什么?没错,就是上网,如果电脑没有了网络了,我们该怎么去解决呢?首先得去检查原因,是病毒的,就杀毒,如果是没有正确安装网卡驱动就去安装,但是出于网友对安装网卡驱动不知道如何操作, ...
- html安装网卡驱动,网卡驱动怎么装,教您网卡驱动怎么安装
装完系统后一般需要安装一些硬件驱动,说的简单点,电脑要上网就要有网卡,而要让网卡发挥作用就要有网卡驱动,就比如汽车要有汽油才能跑一样的,没有了驱动,网卡就发挥不了作用.那么网卡驱动怎么安装?下面,小编 ...
- Linux I2C核心、总线与设备驱动(二)
从上面的分析可知,虽然I2C硬件体系结构比较简单,但是I2C体系结构在Linux中的实现却相当复杂.当工程师拿到实际的电路板,面对复杂的 Linux I2C子系统,应该如何下手写驱动呢?究竟有哪些是需 ...
- Linux内核分析 - 网络[二]:网卡驱动接收报文
纠结了好多天,终于弄懂了B440X的处理. 上篇讲到通过中断,最终网卡调用了b44_rx()来接收报文 对这个函数中的一些参数,可以这样理解: bp->rx_cons – 处理器处理到的缓冲区号 ...
- linux网卡驱动离线安装_Linux下网卡驱动的安装
//Linux下网卡驱动的安装 //从intel网站上下载下来的Linux驱动是e1000-5.2.52.tar.gz rpm -qa|grep kernel- //source查看是否安装了这个包, ...
最新文章
- Symantec:揭秘Hidden Lynx组织的APT***行动
- 马斯克的星际飞船首次起飞测试成功!起跳150米后平稳着陆,“火星在望”
- 安卓4.2原生rom状态栏显示运营商
- 通过NRM随意切换Taobao镜像和NPM官方镜像
- Java关键字synchronized的简单理解
- 防火墙的数据包拦截方式
- 安兔兔跑分可信吗_安兔兔跑分能信吗?手机性能与跑分关系分析,说点你不知道的!...
- Style之flag标签
- 西电大学计算机专硕,2021西安电子科技大学计算机专硕考研成功经验分享
- 黑马程序员Java零基础视频教程(2022最新Java)B站视频学习笔记-Day13-面向对象进阶01
- ps中海报设计的设计思路
- 更聪明的免费图片素材搜素引擎 Everypixel 用 AI 排除俗气照片
- 三年级下册计算机全册教案,小学三年级下册信息技术教案三篇
- [18调剂]江西理工大学2018年研究生招生预调剂公告
- windows系统垃圾清理的批处理代码
- 软件常用通信协议模板
- 香蕉派安装64位linux,快速上手 香蕉派镜像烧录与系统启动
- 成为 java架构师的书籍推荐
- eclipse32位安装教程_AutoCAD 2018 64位简体中文安装教程
- 量化学习 | 统计套利 Review and Outlook(收藏)