下载源码 https://github.com/nxp-imx nxp官方维护的仓库
编译 编译要选择的模板目录载arch/arm/configs/下, 模板选择imx_v6_v7_defconfig
tftp 采用网络下载的方法,
1 sudo apt-get install tftpd-hpa # Debian/Ubuntu
创建目录 然后修改配置文件
1 sudo vim /etc/default/tftpd-hpa
下面为配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 cat /etc/default/tftpd-hpa # /etc/default/tftpd-hpa # 两个配置 TFTP_USERNAME="tftp" TFTP_DIRECTORY="/home/ygc/Desktop/project/tftp" TFTP_ADDRESS=":69" TFTP_OPTIONS="-1 -c -s" TFTP_USERNAME="tftp" TFTP_DIRECTORY="/home/tuling/nfs/tftp" TFTP_ADDRESS=":69" TFTP_OPTIONS="-1 -c -s"
上面不生效,被覆盖了,采用链接的方式链接过去 重启
1 sudo systemctl restart tftpd-hpa
一些说明 linux的移植相比于uboot。直接拷贝arch/arm/configs/里面的配置,自已名字改一份, 比较容易。 而对于驱动,驱动的编译会在makefile里有一个config的选项,如果在.config里开起,就会去编译。
设备树的makefile中,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 imx6sx-udoo-neo-full.dtb dtb-$(CONFIG_SOC_IMX6UL) += \ imx6ul-14x14-evk.dtb \ imx6ul-ccimx6ulsbcexpress.dtb \ imx6ul-ccimx6ulsbcpro.dtb \ imx6ul-geam.dtb \ imx6ul-isiot-emmc.dtb \ imx6ul-isiot-nand.dtb \ imx6ul-kontron-n6310-s.dtb \ imx6ul-kontron-n6310-s-43.dtb \ imx6ul-liteboard.dtb \ imx6ul-opos6uldev.dtb \ imx6ul-pico-dwarf.dtb \ imx6ul-pico-hobbit.dtb \ imx6ul-pico-pi.dtb \ imx6ul-phytec-segin-ff-rdk-emmc.dtb \ imx6ul-phytec-segin-ff-rdk-nand.dtb \ imx6ul-prti6g.dtb \ imx6ul-tx6ul-0010.dtb \ imx6ul-tx6ul-0011.dtb \ imx6ul-tx6ul-mainboard.dtb \ imx6ull-14x14-evk.dtb \ imx6ull-colibri-emmc-eval-v3.dtb \ imx6ull-colibri-eval-v3.dtb \ imx6ull-colibri-wifi-eval-v3.dtb \ imx6ull-jozacp.dtb \ imx6ull-myir-mys-6ulx-eval.dtb \ imx6ull-opos6uldev.dtb \ imx6ull-phytec-segin-ff-rdk-nand.dtb \ imx6ull-phytec-segin-ff-rdk-emmc.dtb \ imx6ull-phytec-segin-lc-rdk-nand.dtb \ imx6ulz-14x14-evk.dtb \ imx6ulz-bsh-smm-m2.dtb dtb-$(CONFIG_SOC_IMX6ULL) += \ imx6ull-naro.dtb
注意最后一项不需要 \。
CONFIG_SOC_IMX6ULL 去deconfig文件中开启,对于图形化配置界面,则使用kconfg界面去开启。
对于deconfig文件和.config文件,两者的差异是:
在 Linux 内核源码中,arch/arm/configs/ 下的配置文件和源码根目录下的 .config 文件虽然都用于配置内核编译选项,但它们的作用和使用场景有所不同。以下是两者的主要区别:
1. arch/arm/configs/ 下的配置文件
作用 :提供预定义的默认配置模板。
类型 :通常是架构相关的配置文件(如 imx_v6_v7_defconfig)。
用途 :
作为构建 .config 的起点。
提供一个特定平台或功能集的标准配置。
生成方式 :
用户可以通过 make ARCH=arm imx_v6_v7_defconfig 命令将该配置文件复制到源码根目录下,生成 .config 文件。
特点 :
静态文件,不随编译过程变化。
可以有多个不同的 defconfig 文件,对应不同平台或需求。
示例:
1 make ARCH=arm imx_v6_v7_defconfig
2. .config 文件(位于源码根目录)
作用 :当前内核编译的实际配置文件。
内容 :包含了所有选中的内核选项(例如 CONFIG_SOC_IMX6ULL=y)。
生成方式 :
通常由 defconfig 文件生成,也可以通过 make menuconfig、make kconfig 等图形化工具修改后保存。
用途 :
编译时直接被 Kbuild 使用来决定哪些代码需要编译。
所有模块、驱动、功能的启用/禁用都由此文件控制。
特点 :
动态文件,会随着用户配置而改变。
是最终生效的配置文件。
示例:
总结对比
特性
arch/arm/configs/xxx_defconfig
.config
位置
在 configs 目录下
在源码根目录
用途
提供默认配置模板
实际使用的配置文件
是否可编辑
可以编辑,但一般只读
可随时修改
生成方式
用户手动选择或创建
由 defconfig 或 menuconfig 生成
是否生效
否,仅作为模板
是,直接影响编译结果
应用场景建议
如果你是初次移植内核,可以从 arch/arm/configs/ 中选择一个最接近目标平台的 defconfig 文件作为起点。
如果你已经有一个 .config 文件,并需要微调配置,可以使用 make menuconfig 来修改 .config。
在调试或开发过程中,.config 是主要操作对象;而 defconfig 更多用于标准化和复用配置。
驱动的makefile 一般在当前的驱动源码的makefile中,可以找到的编译选项,然后去.config中开启。
对于5.17内核 5.17内核出现的RNG驱动错误。 RNG驱动用于产生随机数,在设备树中注释掉,用不到,后续用到在研究。
1 2 3 4 5 6 7 // rngb: rng@2284000 { // compatible = "fsl,imx6ull-rngb", "fsl,imx25-rngb"; // reg = <0x02284000 0x4000>; // interrupts = <GIC_SPI 6 IRQ_TYPE_LEVEL_HIGH>; // clocks = <&clks IMX6UL_CLK_DUMMY>; // };
修改网络 只需修改网络的复位smsc.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 static int smsc_phy_reset (struct phy_device *phydev) { int err, phy_reset; int msec = 1 ; struct device_node *np ; int timeout = 50000 ; int rc; if (phydev->mdio.addr == 0 ) { np = of_find_node_by_path("/soc/aips-bus@02100000/ethernet@02188000" ); } else if (phydev->mdio.addr == 1 ) { np = of_find_node_by_path("/soc/aips-bus@02000000/ethernet@020b4000" ); } if (!np) { return -1 ; } err = of_property_read_u32(np, "phy-reset-duration" , &msec); if (!err && msec > 1000 ) msec = 1 ; phy_reset = of_get_named_gpio(np, "phy-reset-gpios" , 0 ); if (!gpio_is_valid(phy_reset)) return -1 ; gpio_direction_output(phy_reset, 0 ); gpio_set_value(phy_reset, 0 ); msleep(msec); gpio_set_value(phy_reset, 1 ); rc = phy_read(phydev, MII_LAN83C185_SPECIAL_MODES); if (rc < 0 ) return rc; if ((rc & MII_LAN83C185_MODE_MASK) == MII_LAN83C185_MODE_POWERDOWN) { rc |= MII_LAN83C185_MODE_ALL; phy_write(phydev, MII_LAN83C185_SPECIAL_MODES, rc); } return genphy_soft_reset(phydev); }
config中开启驱动的支持 1 2 3 4 5 6 7 8 9 10 obj-$(CONFIG_NATIONAL_PHY) += national.o obj-$(CONFIG_NXP_C45_TJA11XX_PHY) += nxp-c45-tja11xx.o obj-$(CONFIG_NXP_TJA11XX_PHY) += nxp-tja11xx.o obj-$(CONFIG_QSEMI_PHY) += qsemi.o obj-$(CONFIG_REALTEK_PHY) += realtek.o obj-$(CONFIG_RENESAS_PHY) += uPD60620.o obj-$(CONFIG_ROCKCHIP_PHY) += rockchip.o obj-$(CONFIG_SMSC_PHY) += smsc.o obj-$(CONFIG_STE10XP) += ste10Xp.o obj-$(CONFIG_TERANETICS_PHY) += terane
CONFIG_SMSC_PHY 开启支持
linux移植驱动的时候注意设备树节点 如imx6ull.h 中定义的节点,不一定和imx6ul.h的移植,同一个名字,寄存器地址可能不一样
总之就是以imx6ull.h为准,如果没有在从包含的imx6ul.h中找,优先以imx6ull.h为准