嵌入式系统移植课笔记5Linux内核网卡移植(华)
我们除了CPU 有差异以外 , 外围的各种器件board 也是有差异的,
我们除了CPU 有差异以外 , 外围的各种器件board 也是有差异的,
我找到最接近我们板子的 config 配置,
我们要选择一个跟我们功能配置最接近的config 文件,比如三星发布了三款样机,一款三针对平板,一款三针对手机,一款样机针对路由器,而你的产品是针对手机的,你可能比较可能拿了一款针对平板的或者针对路由器的,很多配置都不一样,你要做大量的移植, 所以选配的时候我们要选和我们产品最类似的,
如果你第一次编译uImage 并且运气好, 运行再板子上串口没有问题 可以打印出 CPU版本信息 , 串口输出信息, 只要你看到这些信息那恭喜你,移植内核的第一个大关口 过了, 也就是说. 这个产品支持CPU 支持串口 ,内存是支持的能看到相关的信息, ,但是如果说你运行内核 板子上电运行uImage 这个屏幕是黑的 ,什么信息都没有, 那这个怎么办 ?
那就是第二个问题, 移植对串口的支持, 是不是串口搞错了, 设置得CON2 你用得CON3, 或者地址搞错了
有了串口信息之后就方便你后面得调试了, 如果串口不好, 后面得网卡 摄像头, 移植得时候 没有串口信息帮助, 你怎么知道正常不正常,
移植得工作量, 根据公司得 定制化程度来决定得 ,如果你网卡换了,串口换了 ,usb换了, sd卡换了,换了很多,那工作量就很大.
1.内核选配置 然后编译 , 不顺利得话还要配置一下串口
2.移植改过得设备, 比如网卡移植
3.驱动移植
Linux 内核 配置编译
+
刚才官网下载 Linux 内核 过后找一个最类似的配置,选配过后编译生成我们的uImage , 我们选择一个官方的配置和开发板最接近的,这个配置包括对cpu的支持对外围器件的支持,和最大限度的相似,一般厂商在生产出来cpu过后它都会做个样机,然后把这个样机相关的内容和内核相关的配置, 比如正cpu外面接内存接flash怎么接怎么选配接网卡接摄像头怎么接它都会有一个参考配置,而我们很多公司在开发产品的时候也是去找方案提供商提供的方案和原厂的芯片厂商发布的开发板方案是类似的,我们在它的基础上做一下修改,每个公司可能修改的情况不一样,但是都是基于它作修改,所以我们下载内核过后第一件事情就是选配,进行配置编译,
如果不进行配置 默认是编译 x86 得, 所以这个时候就需要,需要我们去选配一下, 并且我们linux内核默认支持x86的 那么你要编译生成我们的这个arm系列的 A9 4412的这个cpu我们知道不同的cpu他的交叉编译工具链是不一样的, 所以编译的时候你要指定我们的交叉编译工具链, 所以我们要先改一下交叉编译工具链,
arm发布的配置文件目录在,arch/arm/configs/
arm发布的配置他的配置文件都放在configs 下面, 它的配置很多你找一下哪一个配置文件是对应你的,我们看电路图上官网去对比,或者,问 4412这个cpu的这个厂商技术支持,
我们最终得到的是exynos_defconfig 这个配置文件,你需要导入这个配置, 这个配置是配置好的,比如对内存对flash ,串口都是配置好的,你没有必要重新去配,重新去配的话会很麻烦很累,我们直接导入他的配置就可以了。
在它的基础上进行改,
导入的时候 直接 make exynos_defconfig
直接导入出错了,这里的出错原因告诉我们,这个默认的是x86系列的,
我们需要在Makefile里面改一下它是针对哪个系列的cpu,把交叉编译工具改一下,
我们vim Makefile 找CROSS
你可以在文件中直接改,也可以通过命令参数的形式去改,
make ARCH=arm CROSS_COMPILE=arm-none-gnubi-
但是用命令去改的话,你每次去编译的时候会很麻烦,很长, 我们一般在Makefile里面写死,
我们把cpu设置好之后,再次进行config的导入,make exynos_defconfig
configuration written to .config
意思是导入进来了,变成了当前的配置,当前配置就是 .config
接着我们要激活一下这个配置,
make menuconfig
你要是什么也不改,好像也得敲这个命令进去menuconfig菜单进行激活一下
移植第一个原则 :下载的内核能在板子上运行起来,能够输出信息显示出来,你要保证少修改代码甚至不修改, 改的越少越不容易出错, 等你的串口有输出了你再去做相应的配置,
我们直接make uImage进行编译,

我们把编译好的uIamge 拷贝到tftp服务目录下,
编译完过后,3.14内核的它是 uImage包括cpu相关的信息, 但是cpu和外围的各个设备 都是在设备树里面描述的,没有设备树,这个cpu是运行不了的,不像以前的版本,外围设备的描述都是包含在内核里面的, 在这里是分开的,cpu的外围设备都是通过设备树来描述的,所以我们还要去编译一下我们的设备树,
make dtbs
我们这里的设备描述是跟origen.dtb ,这个文件类似的, 我们把这个设备树文件拷贝到tftp服务目录下
然后我们把板子上bootcmd 上的信息也配置好然后,加载到板子上去运行
内核编译得主要目的 就是要实现,
官网下载得linux 内核能在开发板上运行 cpu支持 ,可以输出串口信息, 但是我们发现 内核报了这样一个错误

思考一下, 板子上电得时候 首先是运行bootloader 然后不干预, 进入自启动模式, bootloader下载我们得内核,下载完成之后接着下载我们得设备树 , 运行我们得内核 ,
出现 , 内核是有输出但是,到这里报错误,说 不能挂载根文件系统,
为什么呢 ?
前面讲环境搭建的时候,讲到nfs服务, 前面采用的方式是tftp起来过后下载内核,下载内核成功过后接着,我们再通过内核去挂载我们的根文件系统,, 而我们根文件系统是通过bootargs 参数来指定的 ,这是启动参数。是uboot在bootm过后,会把这个参数传给我们内核,内核通过解析这个参数,知道我要挂载根文件系统从哪里挂载, 我们前面还讲了一种方式就是从网络挂载,根文件系统是在远程某台电脑的上面,后面讲到根文件系统的制作还会讲到,这个根文件系统可以在内存里面可以在flash里面可以在硬盘里面都可以,
bootargs的目的就是告诉内核我们的根文件系统从哪里获取,从哪个入口获取,
我们通过这个参数就知道,我们根文件系统是nfs服务上去获取的, 那nfs谁来挂载呢 ?它是由内核进行挂载的,而内核进行挂载的话, 必须要走网络网线,而我们这个开发板,前面移植的时候只是选了一个跟这个开发板最类似的配置,是官方发布的一个,我们的板子跟三星发布的板子不一致,比如说把网卡更换了。dm9000 网卡配置不一样肯定用不了,网卡都用不了,nfs是个网络文件你通过网线连接的, 网卡都不支持上层的网络协议更不用说了
,所以说你再通过内核去挂载 nfs文件系统的时候肯定会失败,内核在哪里挂载, 内核运行快结束的时候就会去解析这个bootargs命令,然后用nfs服务尝试去挂载我们的根文件系统, 那么基于网卡的一系列的服务都会出问题,所以这个地方内核就挂了, 如果你对这个板子的启动流程不知道,运行过程不知道,你怎么知道问题出在哪里, 怎么去排查问题, 所以说启动流程是蛮重要的,我们知道了原因过后,接下来做的事情就是 ,我们如何去使我们能够挂载nfs服务成功,. 我们要支持nfs服务, 我们怎么才能使nfs服务使用正常呢 ? 我们知道这个网卡已经换了,换了过后你怎么去修改,我们软件 3.14内核改什么东西, 首先nfs 是网络服务, 是走tcp/ip协议的 ,你在内核里面也要支持 tcp/ip协议,
我们怎么使这个内核支持tcp/ip协议 ,支持nfs 文件系统, 通过什么来实现 ?
内核的源码是相当的庞大的, 里面有很多很多目录,这个内核支持很多款CPU,很多款产品, 是全世界很多公司共同来使用的, 你既然支持很多款CPU很多款产品, 那么每次用的时候是不是要进行一个配置选配 , 怎么选配呢?
我们通过 make menuconfig 菜单配置的方式,

General setup (通用设置)
Cross-compiler tool prefix 指定交叉编译工具链的前缀
Enable loadable module support 启用可加载模块支持 (默认选中就可以了)
Enable the block layer 块设备层支持 (支持块设备的 选中)
System Type 系统类型
MMU -based Paged Memory Management Support 支持mmu内存管理
ARM system type (Samsung EXYNOS) 选择arm的哪一款芯片,(这个配置由之前exynos_defconfig这个文件导入的, 这就是导入官方的好处, 我们只需要关心我们改过的东西 ,其他的东西我们采用默认的就可以了,不需要每个选项每个设备都非常清楚 , 除非你可能CPU变了,你在这里重新选一下就行)
****** Boot options ****** 启动选项(这个地方我们一般情况下,在内核移植的时候,我们前面在内核编译的时候,做内核移植的时候,非常幸运,我们直接用官方的内核配置编译出的uImage 直接就能在板子上运行,直接就由信息输出了,有串口信息输出, 但是有些不好的时候都没有信息输出,需要先配置串口, 也就是启动选项, )
在这里面 (3)S3C UART to use for low-level messages 默认指定的是串口3(这里可以对应的进行选择)
Bus support (总线支持)先不管
Kernel Features 内核特性 (很多东西不清楚可以不改动)
Allow booting SMP kernel on uniprocessor systems(EXPERIMENTAL) (多cpu核的方式处理)
(8) Maximum number of CPUs (2-32) 最大速率是8
Boot options 启动引导选项
内核的命令行类型: 当使用bootloader加载内核的时候 ,如果我们这个内核 bootloader没有参数的话 也就是bootargs, 如果有传 bootargs 的话内核以这个参数为准,按bootargs指定的方式去挂载根文件系统, 但是如果我们uboot里面这个参数没有设置,内核怎么办, 内核有一个默认的一个参数 , 是下面那一行

root 后面是根文件系统类型 8M根文件系统大小 console串口终端
如果你没有配置 bootargs 直接运行在板子上出了问题, 很可能跟这个默认参数有关系
CPU Power Management 电源管理
Networking support 网络支持 (支持网络相关的一些协议, 分有线协议核无线协议)
Networking options 网络选项
Device Drivers 驱动目录
File systems 文件系统 (是我们应用程序的载体就像一个仓库一样, 它有很多的文件系统 , 有Flash,有针对硬盘的,有网络文件系统)
因为网卡走的是网络,所以我们要支持我们的网络相关的一些tcp/ip协议
以上配置支持tcp/ip 的选项我们知道了, 但是工作当中我可能移植的不是网卡,可能是摄像头,可能是LCD屏幕等等,别的一些设备,我怎么知道这个选项选哪一个? 这些选项是如何确认的? 怎么得来的? 一般常用设备的移植配置, 比如我们在公司开发产品的时候,要移植网卡, 在另外一块板子里面可能版本比较老,网卡已经支持了,那菜单的选项是差不多的,在移植的时候就参考那个,把那个版本的make menuconfig 打开,看它是怎么选的,然后你照着选择,可以选择多但是不可以选择少,先把功能实现了,再把功能一步步裁剪,还有一种方式就是把内核里面,各个菜单的关联关系先在源码里面搞清楚才行,但是,你要把源码各个菜单的关系搞清楚不是一时半会搞得定的, 我们一般借鉴以前已有的功能, 比如网卡,或者摄像头,有支持的看以前是怎么配置的,照着做,另外可以通过网络去搜索一下他们是怎么设置的, 如果不确定,可以多选但是不能少选,一般做内核移植的,走在时代前沿的可能性比较小,大部分是别人做过的,你都可以搜的到,
我们现在的网络协议已经支持了, 我们NFS是一个文件系统, 它还得对这个文件系统做一个相应的支持,我们这里要选择支持nfs文件系统,
NFS文件系统已经支持了,那我们接下来要看看网卡,网卡换了,我们看看网卡驱动是不是支持,这个驱动我们先看内核里面,一般情况下我们先看内核里面有没有这款驱动,因为现在linux内核支持的平台都是很广泛的,很多设备很多驱动都有的,看看有没有,有的话选配就可以了,如果没有再从第三方的移植过来,甚至自己写一个驱动, 我们开发的时候都是要先看看有没有,如果有直接用,如果没有再考虑自己看旁边的同事有没有类似产品的驱动,把它移过来,实在不行才是自己再开发一个驱动,
接下来配置网卡得支持
我们移植网卡的时候,要想知道网卡是哪个, 首先要去看芯片手册,电路图,,去看一下我们的网卡是哪个型号版本,我们然后去make menuconfig 里面去找相关的配置,
我们按照下面的配置,其他的LCD屏或者其他的配置操作流程也就是这样,无非就是选项不一样,
我们得驱动放在 Device Drivers 下面
Network device support 网络设备
Ethernet driver support 以太网
DM9000 网卡型号
这样是不是就算移植成功了呢 ?
我们再进行make uImage 看一下 ,然后运行到板子里面去
是成功不了得, 还是失败得 !
为什么还是失败呢 ?
NFS 系统支持了, TCP/IP 协议支持了,网卡驱动也支持了,为什么还是失败呢 ?不能往下走呢 ?
你选配了NFS支持, TCP/IP协议支持, 网卡驱动得支持, 但是你想一想有没有完, 还差什么东西 ? 选配是Linux内核官网发布得 3.14内核,已经支持了, 3.14内核它可以知道有DM9000驱动, 但它知不知道这个网卡和这个CPU它有哪些管脚连接, 如果这个网卡芯片遇到中断 , 它用哪个中断管脚,它可能知道码 ?我们不同产品外围设备和这个CPU的连接信息是不一样的, 它不可能预先知道,虽然说 Linux 内核已经支持了大部分设备, 但是具体个性到某一个产品它的连接方式, 每一个管脚连接, 怎么连接, (有几个中断)中断连哪个管脚 ,地址信息输出线用哪一个 ? 它不可能知道, 也就是说我们还要有一个地方叫描述, 和我们CPU之间是怎么连接的 , 也就是说这个网卡,这个网卡芯片和我们的CPU , 它不可能预先知道这个网卡芯片和这个CPU进行通信肯定是有一些管脚连线, 连到我们CPU , 它采用哪个管脚连接 , 它用的中断脚,哪个中断线连接到CPU, 连接的哪个中断脚,它也不可能知道,你必须要有一种方式去告诉我们内核 你的网卡和CPU 是怎么连接的,必须要有这么一个机制,在 3.14 内核里面它通过 设备树来进行描述的
通过配置我们的设备树文件, 专门有一个目录这个文件叫设备树文件 ,是各配置文件,它是专门去描述我们这个网卡和CPU之间的连接方式, 用的哪个管脚, 中断用的哪个中断 ? 等等用这个文件去描述,我们这里所要做的事情在这个设备树文件里添加网卡和CPU之间的连接信息 ,这些信息的描述, 我们简单看一下这个文件
arch/arm/boot/dts/
打开文件我们可以看到有很多个 , 4412在发布的时候设备树文件有两款, 我们用的是
exynos4412-origen.dtb 这个文件是编译后在板子上运行的文件
exynos4412-origen.dts 这个文件是编译前的描述文件
设备树文件是arm在3.14内核以后才去添加这个设备树的支持的,其实设备树很早就提出了,只不过三星比较落后或者arm系列比较落后, 后续才提供的, 它相关的资料相对比较少和比较新, 很多资料多少英文的,我们先从使用角度去看,大概知道怎么去改, 怎么去运用它,
make dtbs
设备树主要是干嘛的 ?
用来描述CPU和外部设备的信息连接的
硬件拓 : 就是CPU接一个外部设备, 这个外部设备再接其他的外部设备 ,这样的树状结构,
采用结点和属性的方式组成, 一个结点下面可以包含多个子结点 . 像我们学的数据结构二叉树 , 它每一个描述都包括一个东西 name 和 value
官方有个说明文档 : Documentation/devicetree/bindings/arm/exynos
我们打开arch/arm/boot/dts/exynos4412-origen.dts
设备树采用嵌套的方式可以包含子文件, 可以把功能剥离出去 就像C语言包含头文件一样的,
根结点里面有很多的子结点, (我感觉就是普通的代码 一个类{};代表一个结点)
model = “Insignal Origen evaluation board based on Exynos4412” 意思是用于三星发布得基于exynos4412的一个名字叫Origen的评估版
compatible = “Insignal,origen4412”,“samsung,exynos4412” 兼容的意思, 也就是找的时候可以通过这个名字去找可以是多个名字自动去匹配的,


这个文件里有对各个设备结点的描述,
添加的结点的时候, 你在结点与结点之间添加就可以了,
CPU内部有一个地址,
我添加了设备树之后,我们看能不能运行
得先 make dtbs
我把这编译好的拷贝过去
我们重新板子上电, 看nfs服务能不能挂载成功
还是有报错
还需要修改下面的文件,我们先不管什么意思,先试着改

修改之后我们再次进行,make uImage
编译完之后拷贝到tftp目录下 ,
我再重新上电运行 ,这次成功了
我们是如何挂载成功的,就是我们设备树里面加了这个网卡和CPU连接信息的描述,还把定义的
static bool clk_ignore_unused = true;
设备树描述在移植过程中很容易想到,但是这个clk_ignore_unused 这里我们很难想到,也许遇到这个问题就卡你很久了,遇到这个问题怎么办? 一种方法是,把报错信息去百度搜索一下,是在找不到看官方的。再不行我们才用代码对比的方式,比如说我们现在是3.14的版本内核,以前可能用过2.6的 或者3.0的内核,那里面的内核可能也用到类似的网卡,我们用对比的方式,去看一看他们差异再哪里,
这个clk_ignore_unused 的原因可能是,本来通过make menuconfig 的方式修改的,结果不知道什么原因采用了直接改源码。可能是make menuconfig里面少选了,或者哪个参数少配了。
现在我们板子已经能挂载NFS文件系统了,
设备树文件 exynos4412-origen.dts 里面可以添加很多个子结点,
名字可以任意取, 它只是问了在文档内部区分不同得结点之间得一个标识而已, 只要不重复就可以
compatible=“simple-bus”; 名字,指得是它这个结点会找得总线是我们CPU内部用到得总线,会自动适配
reg=<0x5000000 0x1000000>; cpu会通过一个总线,总线上面挂了很多设备, 不止一条总线可能多个总线, 其中有一条总线 叫SROM 总线,它是接外部存储器得,外面可以接 小型得ROM ,RAM, 包括网卡 里面有一定空间得,它都会把这些设备挂载到总线上面, 设备树主要得目的是描述我们CPU和我们外设之间得连接关系, 这里是网卡连接到CPU得 哪一个地方,它里面是有一个总线得, 我们可以通过compatible (指cpu内部得总线SROM总线)
下面这些字段是用来描述cpu内部总线的信息, 往下加了一个结点ethernet@5000000这个结点是对网卡信息的描述,但我们这里面 如果挂多个设备的话,这里面还可以新增别的结点,是个树状结构 结点格式为 结点名称{结点描述};

内部总线可能有多个, 它怎么区分不同的总线呢, 你怎么知道总线是哪一根 ? 肯定有一个地址来进行标识,就说通过 reg 这个地址来指定, reg 指定就是寄存器地址, 这个总线是一个范围,0x5000000 是开始地址, 0x1000000 是它的长度,这两个值 怎么来的呢 ? 其实我们在做移植过程中,前面这个菜单的选配,对TCP/IP的支持,对网卡的支持,对NFS文件系统的支持,相对比较容易的,我们移植过程中最麻烦的地方在如何去描述我们的外部设备 于cpu之间的连接信息,比如网卡,传感器等怎么去描述, 这里涉及到你要看得懂电路图, 管脚,需要看得懂芯片手册用的是哪个寄存器地址, 也就是通过设备树里面设置这些相关的信息,去描述他们的连接方式,而且不同设备是不一样得,这个比较麻烦,
这个0x5000000 和 0x1000000 是怎么来的,要看这个地址, 首先这个地址我们怎么去找到它,我们通过外设作为参考信息一步一步的去找,通过管脚找到我们的CPU 然后找到对应的芯片手册,去找它的地址,
首先打开电路图, 分两张电路图, 一个外围板的电路图, 一个是核心板电路图, 另附芯片手册
先打开外围板电路图, 因为外设在外围板上,
具体cpu是哪个地址去控制它的我们通过管脚去倒推, 这个CPU要通过网卡进行通信,那怎么找到这个网卡呢 ? 有一个管脚叫CS管脚, 假如低电频触发,BUF_XmOcs1低电频的时候才会被选中, 也就是和它进行通信所以这个地方我们以BUF_XmOcs1 这个为入口 ,去跟踪去搜, 找到转换芯片, 转换芯片是一一对应的, 我们找到转换芯片的XmDcs1 ,这个名字再在外围板上面去搜, 搜不到了,原因是这个可能在我们的核心板,外围板只是描述我们外围的器件,这些器件连接到CPU的某个 管脚,我们去搜我们的核心板, 我们打开核心板搜索一下,

我们在核心板里找到了XmDcs1 对应的是Xm0CSn1/NF_CSn2/MP00_0_1这个管脚, 也就是CPU通过这个管脚去选中我们的网卡,那这个管脚对应的控制, CPU怎么去控制这个管脚的呢 ? CPU内部是有一系列的寄存器的通过寄存器地址去控制它,我们只要找到这个寄存器地址,就可以了,那我们怎么去找 ?
我们以这个Xm0CSn1/NF_CSn2/MP00_0_1作为入口, 我们去看它的芯片手册, 搜一下这个Xm0CS找到Xm0CSn_1 我们再用Xm0CSn去搜索
如果是网卡的我们去找于网卡有关的章节 , 我们发现没有对应网卡的章节, 最后发现不叫dm9000 ,不叫network这种名字, 不像之前讲PWM控制的时候它的缩写是 PulseWidth Modulation Timer 在这里 , 它叫SROM Controller这个章节在这里, 这个告诉大家我们CPU外部 接我们的网卡 , 是通过SROM这么一个模块去接的, 这个CPU内部是有一张图的, 我们这个CPU是个很强大的的CPU, SOC系统是一个片上系统, 早期单片机的时候我们一个CPU功能很简单,它可能有多个芯片,有负责传感的,有负责通信的,很多个芯片在板子上集成,现在是一个CPU很多功能集成在里面去,我们可以把这个产品做的很小, 这就是我们的CPU核 , 外面呢接了很多外围的模块,比如说我们的多媒体模块,包括摄像头,2D,3D处理引擎, GPS模块,音频模块,电源管理,安全控制,还有常用的一些模块,比如DMAC ,PW控制,看门狗等,还有一些常见的接口 ,usb ,i2c等, 还有一个Memory 存储控制,就是我们最终的数据存储到某个位置,它怎么控制的,DRAM控制我们内存的,NAND Flash 外接Flash的,SROM 支持外接8-16位的NOR的Flash ,PROM/SROM
所以这个网卡可以作为一个RAM设备接在我们的SROM ,这个SROM是有地址的, CPU通过SROM找到这个模块,我们找到这个SROM之后,我就要找CPU核是通过哪些东西来控制它的.

它是一个Bank的片选_x表示0 1 2 3 匹配我们通过电路图可以看到有4个这样的片选线, n0这个管脚如果你接的这个设备cs1 就是bank1 如果是cs0接的就是bank0 ,cs2接的就说bank2 .有4个Bank ,
我们片选网卡的是csn1 ,而csn1对应的 是Bank1 所以我们的地址0x05000000 , 因为访问的时候是并行方式访问的 ,不是一根线或者两根线或是串口, 所以地址空间有个范围 0x05000000 是它的起始地址, SROM用这个用这个csn1片选的时候它的地址就是这个地址,它的长度 , 用后面的值0x06000000 - 0x05000000 就是它的长度
知道意思之后, 如果以后硬件有变化, 比如说 它把csn1的脚变成了csn2了 就把reg= <0x5000000 0x1000000> 这个地方改成reg= <0x6000000 0x1000000> 通过这个地址 找到SROM,通过SROM找到我们的网卡 .
要找这个参数,除了看设备树文件以外,还需要会看芯片手册,可是芯片手册你需要反复的前后去参照,反复的去看,
SROM找到之后,SROM也可以接Flash, 可以把网卡看成RAM ,
ethernet@5000000 这个就是对这个网卡RAM它的一个描述信息 (结点)描述一个网卡要怎么描述呢?这个信息怎么来的? 我们怎么知道这样写呢/?
会有很多参考和样例的,这个地方我们可以找, 先找它的样例,它有一个帮助文档,
Documentation/devicetree/bindings/net/devicom-dm9000.txt
打开这个文档,

这个就是对应我们的网卡描述,我们的信息是参考这个信息改的,
dm9000的驱动地址; 这个网卡驱动是和平台无关的,也就是你硬件有变化,无论你是哪个cpu哪个产品,这个驱动程序是不变的,他是控制网卡芯片的上层逻辑,具体的网卡芯片和这个cpu的连接信息,它是剥离出去的,放在设备树文件里面去,不同的产品对应不同的设备树,也就是说你以后板子有变化,一个产品对应一个设备树文件,你只要改这个设备树文件就可以了,你的驱动程序是可以不变 , 最厉害的产品就是应对变化,面对不同的产品你代码可以不改或者少改, 驱动里面会通过这个名字compatible=“davicom,dm9000” 去设备树里面对应的同名的这个网卡结点的描述, 因为设备树里面描述了很多个设备和cpu的连接信息,具体是哪个点

驱动程序是剥离出去的,你要驱动网卡,你是不是要找到网卡的地址?如果管脚都不知道你怎么去访问它,所以驱动运行肯定是要有compatible信息,这就是我们通过make menuconfig选配的网卡还是挂载失败的原因(设备树没有对应网卡的描述)得通过这个compatible名字去找到它,这两个是对应的,davicom是厂商dm9000是型号,
reg= <0x5000000 0x2 0x5000004 0x2> 我们学ARM知道CPU要控制外面的设备都是通过一些寄存/器地址来找到他的,而这个值,这个地址和上面的地址是类似的,0x5000004是怎么来的? 0x2是数据的宽度 reg是一个物理地址和这个寄存器的长度,它包括两个条目, 第一个条目表示地址,第二个条目是数据寄存器,
这个网卡三由并行方式传输的,0-15十六根数据线,数据总线,16位的话就是两个字节的宽带2就是16位 (2*16=32),如果你看到哪个芯片不是16位了,是8位的那这个数据宽度就是1,如果是32位的数据宽度就是4, 你前期根本不知道什么意思就参考模板就可以了,
这个网卡还用到了中断, INT -----DM9000_IRQ 我还要去设置它的中断,,中断的主要目的是提升实时率,只要这个网卡受到数据,它就发送一个信号给CPU打断CPU当前运行程序然后及时处理当前网卡的程序,一般复杂的设备都要用到中断,中断是提升设备实时性的很重要的东西, 这里设计三星设计的很简单,你只要告诉它是哪个管脚就ok’了,
首先找到这个名字DM9000_IRQ去搜索,外围板电路图
再搜核心板的电路图,
我只要告诉cpu是哪个组哪个脚就可以了,cpu内核源码会帮你去解析,不像ARM里面还要设置一堆的寄存器,GPX0_6
arm/gic.txt 中断描述4代表高电瓶触发

更多推荐
所有评论(0)