Chinaunix首页 | 论坛 | 博客
  • 博客访问: 463866
  • 博文数量: 100
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 955
  • 用 户 组: 普通用户
  • 注册时间: 2014-11-21 09:30
文章分类

全部博文(100)

文章存档

2017年(1)

2016年(16)

2015年(83)

我的朋友

分类: 嵌入式

2015-09-25 04:15:50

以前一直用设备树内核启动210失败,以为是自己哪里没弄好,内存还是dts没改好,结果,呵呵,是被三星给坑了,直到4.2.1才修复时钟初始化bug。就这样,一年过去了,我才能用210玩设备树,像蜗窝说的,真的很想把三星的内核维护人员拉出来暴打一顿。现在这个bug暴露出来,才发现其实对比一下三星其他的cpu clock代码,很容易发现这个bug,也怪自己太相信kernel.org了,谁能想到三星维护的代码都没有测试过就提交到kernel.org了?三星都是这么写代码的么?怪不得内核驱动一堆bug。写代码都没用板子试过的,真牛的。

总结下来,凡是做移植工作,一定要保持怀疑的态度,连kernel.org都不能相信,否则会被坑很惨。要是早点怀疑kernel的代码,也不用这么折腾了。

修改ethernet结点:

关键是修改reg属性,第一个cell是INDEX端口地址,第3个cell是DATA端口地址。具体含义可以在内核源码中搜索davicom,dm9000其实就在Dm9000.c (drivers\net\ethernet\davicom)文件中。
Davicom-dm9000.txt (documentation\devicetree\bindings\net)也有相应的说明。
关于interrupts属性,可以查看interrupt.txt的说明:
  The #interrupt-cells property is set to 2 and the first cell defines the index of the interrupt within the controller,
while the second cell is used to specify any of the following flags:
    - bits[3:0] trigger type and level flags
1 = low-to-high edge triggered
2 = high-to-low edge triggered
4 = active high level-sensitive
8 = active low level-sensitive

interrupts第一个cell 是指定gph1中的第几个中断。GPH1总共有8根引脚,连接了8个外部中断XEINT8~XEINT15。
三星的SMDKV210连接的是GPH1_1(XEINT9),我的板子连接的是GPH1_2,即XENIT10,因此interrupts改为<2 4="">。

但是这样修改后发现网卡还是起不来,不能挂载NFS,猜测GPIO肯定要进行相应初始化,先设置XEINT10的功能:
    eint10: ext-int10 {
        samsung,pins = "gph1-2";
        samsung,pin-function = <0xf>;
        samsung,pin-pud = <0>;
        samsung,pin-drv = <0>;
    };

开机无法挂载NFS,先用ramdisk挂载一个rootfs试试。

点击(此处)折叠或打开

  1. ethernet@18000000 {
  2.         compatible = "davicom,dm9000";
  3.         reg = <0xA8000000 0x2 0xA8000002 0x2>;
  4.         interrupt-parent = <&gph1>;
  5.         interrupts = <2 4>;
  6.         local-mac-address = [00 00 de ad be ef];
  7.         davicom,no-eeprom;
  8.     };
  9.     
  10.     gph1: gph1 {
  11.         gpio-controller;
  12.         interrupt-controller;
  13.         interrupt-parent = <&vic0>;
  14.         interrupts = <8>, <9>, <10>, <11>,
  15.                 <12>, <13>, <14>, <15>;
  16.         #gpio-cells = <2>;
  17.         #interrupt-cells = <2>;
  18.     };
  19.     
  20.     vic0: interrupt-controller@f2000000 {
  21.         compatible = "arm,pl192-vic";
  22.         interrupt-controller;
  23.         reg = <0xf2000000 0x1000>;
  24.         #interrupt-cells = <1>;
  25.     };

我在使用了s5pv210-smdkv210.dts这颗树,其中有dm9000的节点:
ethernet@88000000 {
compatible = "davicom,dm9000";
reg = <0x88000000 0x2="" 0x88000004="">;        //INDEX端口为0x88000000,DATA端口为0x88000004
interrupt-parent = <&gph1>;                               //中断为gph1_2
interrupts = <2 4="">;                                            //XEINT10,是gph1的第3个中断脚,所以修改为<2 4="">
local-mac-address = [00 00 de ad be ef];            //mac地址,任意
davicom,no-eeprom;
};
但是我并没有看到dm9000_probe函数的执行(我使能了DEBUG),如何判断dm9000 device挂入了设备链表?

参考:

基于FS4412内核移植之DM9000网卡驱动添加:


Documentation/devicetree/bindings/arm/gic.txt
Documentation/devicetree/bindings/arm/samsung/interrupt-combiner.txt
Documentation/devicetree/bindings/net/davicom-dm9000.txt





阅读(3796) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~