目录
一、重要文件及目录
arch/arm/configs
不同平台配置文件
arch/arm/boot/dts
设备树配置
arch/arm/boot
编译输出二进制目录
arch/arm/mach-xxx
相应平台的驱动和初始化文件
二、内核移植
1、添加开发板默认配置文件
cd arch/arm/configs
cp imx_v7_mfg_defconfig imx6ull_my_emmc_defconfig
找到“CONFIG_ARCH_MULTI_V6=y”这一行,将其屏蔽掉
2、添加开发板对应的设备树文件
cd arch/arm/boot/dts
cp imx6ull-14x14-evk.dts imx6ull-my-emmc.dts
修改arch/arm/boot/dts/Makefile
将imx6ull-my-emmc.dtb
添加进去
dtb-$(CONFIG_SOC_IMX6ULL) += \
imx6ull-14x14-ddr3-arm2.dtb \
imx6ull-14x14-ddr3-arm2-adc.dtb \
...
imx6ull-my-emmc.dtb
三、CPU主频和网络驱动修改
1、CPU主频修改
BogoMIPS粗略衡量CPU性能,值越高,性能越强
cat /proc/cpuinfo
/sys/bus/cpu/devices/cpu0/cpufreq
目录下可查看频率及CPU工作模式
menuconfig下设置
CPU Power Management
-> CPU Frequency scaling
-> Default CPUFreq governor
2、自定义频率
修改arch/arm/boot/dts/imx6ull.dtsi
cpu0: cpu@0 {
compatible = "arm,cortex-a7";
device_type = "cpu";
reg = <0>;
clock-latency = <61036>; /* two CLK32 periods */
operating-points = <
/* kHz uV */
792000 1225000 //添加792Mhz支持
528000 1175000
396000 1025000
198000 950000
>;
fsl,soc-operating-points = <
/* KHz uV */
792000 1175000 //添加792Mhz支持
528000 1175000
396000 1175000
198000 1175000
>;
make dtbs
3、使能8线EMMC驱动(kernel默认为4线)
imx6ull-my-emmc.dts
将
&usdhc2 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc2>;
non-removable;
status = "okay";
};
改为
&usdhc2 {
pinctrl-names = "default", "state_100mhz", "state_200mhz";
pinctrl-0 = <&pinctrl_usdhc2>;
pinctrl-1 = <&pinctrl_usdhc2_100mhz>;
pinctrl-2 = <&pinctrl_usdhc2_200mhz>;
bus-width = <8>;
non-removable;
status = "okay";
};
4、网络驱动修改(KSZ8081 换为了 SR8201F)
①修改复位及网络时钟引脚驱动
imx6ull-my-emmc.dts
//删除
pinctrl_spi4: spi4grp {
fsl,pins = <
MX6ULL_PAD_BOOT_MODE0__GPIO5_IO10 0x70a1
MX6ULL_PAD_BOOT_MODE1__GPIO5_IO11 0x70a1
MX6ULL_PAD_SNVS_TAMPER7__GPIO5_IO07 0x70a1 //删除作为SPI的配置
MX6ULL_PAD_SNVS_TAMPER8__GPIO5_IO08 0x80000000 //删除
>;
};
spi4 {
compatible = "spi-gpio";
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_spi4>;
pinctrl-assert-gpios = <&gpio5 8 GPIO_ACTIVE_LOW>; //删除作为SPI的配置
......
cs-gpios = <&gpio5 7 0>;//删除作为SPI的配置
//修改
&iomuxc_snvs {
pinctrl-names = "default_snvs";
pinctrl-0 = <&pinctrl_hog_2>;
imx6ul-evk {
...... /*省略掉其他*/
/*enet1 reset */
pinctrl_enet1_reset: enet1resetgrp {
fsl,pins = <
/* used for enet1 reset */
MX6ULL_PAD_SNVS_TAMPER7__GPIO5_IO07 0x10B0
>;
};
/*enet2 reset */
pinctrl_enet2_reset: enet2resetgrp {
fsl,pins = <
/* used for enet2 reset */
MX6ULL_PAD_SNVS_TAMPER8__GPIO5_IO08 0x10B0
>;
};
};
};
pinctrl_enet1: enet1grp {
fsl,pins = <
......
MX6UL_PAD_ENET1_TX_CLK__ENET1_REF_CLK1 0x4001b031 //修改时钟
>;
};
pinctrl_enet2: enet2grp {
fsl,pins = <
......
MX6UL_PAD_ENET2_TX_CLK__ENET2_REF_CLK2 0x4001b031 //修改
>;
};
1 &fec1 {
2 pinctrl-names = "default";
3 pinctrl-0 = <&pinctrl_enet1
4 &pinctrl_enet1_reset>;//修改
5 phy-mode = "rmii";
......
9 status = "okay";
10 };
11
12 &fec2 {
13 pinctrl-names = "default";
14 pinctrl-0 = <&pinctrl_enet2
15 &pinctrl_enet2_reset>;//修改
16 phy-mode = "rmii";
......
36 };
②修改网卡PHY地址
171 &fec1 {
172 pinctrl-names = "default";
173 pinctrl-0 = <&pinctrl_enet1
174 &pinctrl_enet1_reset>;
175 phy-mode = "rmii";
176 phy-handle = <ðphy0>;
177 phy-reset-gpios = <&gpio5 7 GPIO_ACTIVE_LOW>;
178 phy-reset-duration = <200>;
179 status = "okay";
180 };
181
182 &fec2 {
183 pinctrl-names = "default";
184 pinctrl-0 = <&pinctrl_enet2
185 &pinctrl_enet2_reset>;
186 phy-mode = "rmii";
187 phy-handle = <ðphy1>;
188 phy-reset-gpios = <&gpio5 8 GPIO_ACTIVE_LOW>; //低电平有效
189 phy-reset-duration = <200>; //电平持续200ms
190 status = "okay";
191
192 mdio {
193 #address-cells = <1>;
194 #size-cells = <0>;
195
196 ethphy0: ethernet-phy@2 { //地址
197 compatible = "ethernet-phy-ieee802.3-c22";
198 smsc,disable-energy-detect; //芯片型号
199 reg = <2>; //地址
200 };
201
202 ethphy1: ethernet-phy@1 {
203 compatible = "ethernet-phy-ieee802.3-c22";
204 smsc,disable-energy-detect;
205 reg = <1>;
206 };
207 };
208 };
③修改fec_main.c文件
drivers/net/ethernet/freescale/fec_main.c fec_reset_phy
3330 static void fec_reset_phy(struct platform_device *pdev)
3331 {
...
3356 msleep(200); /* 复位结束后至少再延时 150ms 才能继续操作 SR8201F(芯片操作手册) */
3357 }
④修改内核配置文件
使能smsc驱动并使用SAVE另存imx_my_emmc_defconfig