以前一直用设备树内核启动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试试。
-
ethernet@18000000 {
-
compatible = "davicom,dm9000";
-
reg = <0xA8000000 0x2 0xA8000002 0x2>;
-
interrupt-parent = <&gph1>;
-
interrupts = <2 4>;
-
local-mac-address = [00 00 de ad be ef];
-
davicom,no-eeprom;
-
};
-
-
gph1: gph1 {
-
gpio-controller;
-
interrupt-controller;
-
interrupt-parent = <&vic0>;
-
interrupts = <8>, <9>, <10>, <11>,
-
<12>, <13>, <14>, <15>;
-
#gpio-cells = <2>;
-
#interrupt-cells = <2>;
-
};
-
-
vic0: interrupt-controller@f2000000 {
-
compatible = "arm,pl192-vic";
-
interrupt-controller;
-
reg = <0xf2000000 0x1000>;
-
#interrupt-cells = <1>;
-
};
我在使用了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
阅读(3966) | 评论(0) | 转发(0) |