Device Tree(五)移植DM9000,並掛載NFS
1、新增\修改DTS檔案中DM9000配置
/ { model = "Samsung Louis210 based on S5PV210"; compatible = "samsung,Louis210", "samsung,s5pv210"; chosen { bootargs = "console=ttySAC0,115200n8 root=/dev/nfs nfsroot=192.168.5.136:/root/code/rootfs ip=192.168.5.187 init=/init"; }; [email protected] { device_type = "memory"; reg = <0x20000000 0x40000000>; };
[email protected] { compatible = "davicom,dm9000"; reg = <0x88000000 0x2 0x88000004 0x2>; interrupt-parent = <&gph1>; interrupts = <2 4>; local-mac-address = [00 00 de ad be ef]; davicom,no-eeprom; clocks = <&clocks CLK_SROMC>; clock-names = "sromc"; }; backlight { compatible = "pwm-backlight"; pwms = <&pwm 3 5000000 0>; brightness-levels = <0 4 8 16 32 64 128 255>; default-brightness-level = <6>; pinctrl-names = "default"; pinctrl-0 = <&pwm3_out>; }; }; &xusbxti { clock-frequency = <24000000>; }; /* add by Louis */ &xxti { clock-frequency = <24000000>; };
本次在Linux-4.19.10上面移植DM9000,剛開始DM9000裝置起不來,除錯了很長時間,最終發現是因為沒有使能S5Pv210的SROMC時鐘。
使用外部中斷10,對應GPH1的2號引腳。
配置時鐘為sromc。
2、修改drivers\net\ethernet\davicom\dm9000.c檔案,新增SROMC時鐘使能
--- a/drivers/net/ethernet/davicom/dm9000.c +++ b/drivers/net/ethernet/davicom/dm9000.c @@ -39,6 +39,7 @@ #include <linux/regulator/consumer.h> #include <linux/gpio.h> #include <linux/of_gpio.h> +#include <linux/clk.h> #include <asm/delay.h> #include <asm/irq.h> @@ -1436,6 +1437,7 @@ dm9000_probe(struct platform_device *pde enum of_gpio_flags flags; struct regulator *power; bool inv_mac_addr = false; + const char *clk_name; power = devm_regulator_get(dev, "vcc"); if (IS_ERR(power)) { @@ -1573,6 +1575,18 @@ dm9000_probe(struct platform_device *pde goto out; } + /* Enable clock if specified */ + if (!of_property_read_string(dev->of_node, "clock-names", &clk_name)) { + struct clk *clk = devm_clk_get(dev, clk_name); + if (IS_ERR(clk)) { + dev_err(dev, "cannot get clock of %s\n", clk_name); + ret = PTR_ERR(clk); + goto out; + } + clk_prepare_enable(clk); + dev_info(dev, "enable clock '%s'\n", clk_name); + } + /* fill in parameters for net-dev structure */ ndev->base_addr = (unsigned long)db->io_addr;
3、其他步驟參考 kernel(二)網絡卡(DM9000)及nfs檔案系統
列印資訊:
Starting kernel ... Booting Linux on physical CPU 0x0 Please press Enter to activate this console. random: crng init done Processing /etc/profile... |