• 006-BSP学习笔记-kernel移植


    一、重要文件及目录

    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
    
    • 1
    • 2

    找到“CONFIG_ARCH_MULTI_V6=y”这一行,将其屏蔽掉

    2、添加开发板对应的设备树文件

    cd arch/arm/boot/dts
    cp imx6ull-14x14-evk.dts imx6ull-my-emmc.dts
    
    • 1
    • 2

    修改arch/arm/boot/dts/Makefileimx6ull-my-emmc.dtb添加进去

    dtb-$(CONFIG_SOC_IMX6ULL) += \
    	imx6ull-14x14-ddr3-arm2.dtb \
    	imx6ull-14x14-ddr3-arm2-adc.dtb \
    	...
    	imx6ull-my-emmc.dtb
    
    • 1
    • 2
    • 3
    • 4
    • 5

    三、CPU主频和网络驱动修改

    1、CPU主频修改

    BogoMIPS粗略衡量CPU性能,值越高,性能越强

    cat /proc/cpuinfo 
    
    • 1

    /sys/bus/cpu/devices/cpu0/cpufreq 目录下可查看频率及CPU工作模式

    menuconfig下设置

    CPU Power Management
    -> CPU Frequency scaling
    -> Default CPUFreq governor
    
    • 1
    • 2
    • 3

    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
    			>;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    make dtbs
    
    • 1

    3、使能8线EMMC驱动(kernel默认为4线)

    imx6ull-my-emmc.dts

    &usdhc2 {
    	pinctrl-names = "default";
    	pinctrl-0 = <&pinctrl_usdhc2>;
    	non-removable;
    	status = "okay";
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    改为

    &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";
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    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 };
    
    • 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
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    ②修改网卡PHY地址
    171 &fec1 {
    172 pinctrl-names = "default";
    173 pinctrl-0 = <&pinctrl_enet1
    174 &pinctrl_enet1_reset>;
    175 phy-mode = "rmii";
    176 phy-handle = <&ethphy0>;
    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 = <&ethphy1>;
    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 };
    
    • 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
    ③修改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 }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    ④修改内核配置文件

    使能smsc驱动并使用SAVE另存imx_my_emmc_defconfig
    在这里插入图片描述

  • 相关阅读:
    学JAVA可从事的工作岗位
    Docker基本操作三 (容器相关命令二)
    KubeVela 1.3 发布:开箱即用的可视化应用交付平台,引入插件生态、权限认证、版本化等企业级新特性
    windows下nginx基本指令
    redis篇
    MyBatis-Plus条件构造器[常用的模糊查询、排序查询、逻辑查询和指定字段查询案例]
    大前端进阶
    RabbitMQ初步到精通-第一章-消息中间件介绍
    安卓开发Android studio学习笔记15:关于如何使用Okhttp框架的网络请求(调用API接口)
    OpenMMLab MMYOLO目标检测环境搭建(一)
  • 原文地址:https://blog.csdn.net/qq_38292379/article/details/127614039