因为使用的WiFi模块是mt7612u,正点原子核心板目前提供的4.1内核没有此模块驱动,便移植更新的5.4内核
1 下载内核源码
NXP官方linux仓库地址为: https://github.com/Freescale/linux-fslc/tree/5.4-2.1.x-imx。
2 设置临时环境变量
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
3 清理构建
make distclean
4 加载默认配置
make imx_v7_defconfig
5 先编译一遍
make -j8
针对正点原子核心板,开始移植
6 修改网络驱动
修改设备树文件arch/arm/boot/dts/imx6ul-14x14-evk.dtsi
屏蔽 GPIO5_IO07 GPIO5_IO08 复用功能
pinctrl_spi4: spi4grp {
fsl,pins = <
MX6UL_PAD_BOOT_MODE0__GPIO5_IO10 0x70a1
MX6UL_PAD_BOOT_MODE1__GPIO5_IO11 0x70a1
/* MX6UL_PAD_SNVS_TAMPER7__GPIO5_IO07 0x70a1 */
/* MX6UL_PAD_SNVS_TAMPER8__GPIO5_IO08 0x80000000 */
>;
};
屏蔽 spi4中 这两个引脚功能
spi4 {
compatible = "spi-gpio";
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_spi4>;
status = "okay";
/* pinctrl-assert-gpios = <&gpio5 8 GPIO_ACTIVE_LOW>; */
gpio-sck = <&gpio5 11 0>;
gpio-mosi = <&gpio5 10 0>;
/* cs-gpios = <&gpio5 7 0>; */
num-chipselects = <1>;
#address-cells = <1>;
#size-cells = <0>;
将复位引脚加入到 pinctrl_enet1 和 pinctrl_enet2 节点
pinctrl_enet1: enet1grp {
fsl,pins = <
MX6UL_PAD_ENET1_RX_EN__ENET1_RX_EN 0x1b0b0
MX6UL_PAD_ENET1_RX_ER__ENET1_RX_ER 0x1b0b0
MX6UL_PAD_ENET1_RX_DATA0__ENET1_RDATA00 0x1b0b0
MX6UL_PAD_ENET1_RX_DATA1__ENET1_RDATA01 0x1b0b0
MX6UL_PAD_ENET1_TX_EN__ENET1_TX_EN 0x1b0b0
MX6UL_PAD_ENET1_TX_DATA0__ENET1_TDATA00 0x1b0b0
MX6UL_PAD_ENET1_TX_DATA1__ENET1_TDATA01 0x1b0b0
MX6UL_PAD_ENET1_TX_CLK__ENET1_REF_CLK1 0x4001b009
MX6UL_PAD_SNVS_TAMPER7__GPIO5_IO07 0x10B0
>;
};
pinctrl_enet2: enet2grp {
fsl,pins = <
MX6UL_PAD_GPIO1_IO07__ENET2_MDC 0x1b0b0
MX6UL_PAD_GPIO1_IO06__ENET2_MDIO 0x1b0b0
MX6UL_PAD_ENET2_RX_EN__ENET2_RX_EN 0x1b0b0
MX6UL_PAD_ENET2_RX_ER__ENET2_RX_ER 0x1b0b0
MX6UL_PAD_ENET2_RX_DATA0__ENET2_RDATA00 0x1b0b0
MX6UL_PAD_ENET2_RX_DATA1__ENET2_RDATA01 0x1b0b0
MX6UL_PAD_ENET2_TX_EN__ENET2_TX_EN 0x1b0b0
MX6UL_PAD_ENET2_TX_DATA0__ENET2_TDATA00 0x1b0b0
MX6UL_PAD_ENET2_TX_DATA1__ENET2_TDATA01 0x1b0b0
MX6UL_PAD_ENET2_TX_CLK__ENET2_REF_CLK2 0x4001b009
MX6UL_PAD_SNVS_TAMPER8__GPIO5_IO08 0x10B0
>;
};
在fec1和fec2节点,添加网络驱动复位引脚
&fec1 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_enet1>;
phy-mode = "rmii";
phy-handle = <ðphy0>;
phy-reset-gpios = <&gpio5 7 GPIO_ACTIVE_LOW>;
phy-reset-duration = <200>;
status = "okay";
};
&fec2 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_enet2>;
phy-mode = "rmii";
phy-handle = <ðphy1>;
phy-reset-gpios = <&gpio5 8 GPIO_ACTIVE_LOW>;
phy-reset-duration = <200>;
status = "okay";
修改mdio节点中的mac芯片地址
mdio {
#address-cells = <1>;
#size-cells = <0>;
ethphy0: ethernet-phy@0 {
reg = <0>;
micrel,led-mode = <1>;
clocks = <&clks IMX6UL_CLK_ENET_REF>;
clock-names = "rmii-ref";
};
ethphy1: ethernet-phy@1 {
reg = <1>;
micrel,led-mode = <1>;
clocks = <&clks IMX6UL_CLK_ENET2_REF>;
clock-names = "rmii-ref";
};
};
修改drivers/net/ethernet/freescale/fec_main.c文件,找到函数fec_probe,在函数开头添加如下代码:
void __iomem *IMX6U_ENET1_TX_CLK;
void __iomem *IMX6U_ENET2_TX_CLK;
IMX6U_ENET1_TX_CLK = ioremap(0X020E00DC, 4);
writel(0X14, IMX6U_ENET1_TX_CLK);
IMX6U_ENET2_TX_CLK = ioremap(0X020E00FC, 4);
writel(0X14, IMX6U_ENET2_TX_CLK);
网上说要 修改drivers/net/phy/smsc.c文件里面的复位功能,但我没有修改也正常
配置Linux内核,使能LAN8720驱动,SMSC PHYs 在5.4内核中默认是打开的
7 根据正点原子出厂系统外设复用参考文档v1.3.1,释放CAMERA,AUDIO,LCD,等复用功能,释放更多管脚用于其他功能
修改memuconfig 去掉camera功能
Device Drivers --->
<*> Multimedia support --->
[*] V4L platform devices --->
MXC Camera/V4L2 PRP Features support --->
< > OmniVision ov5640 camera support
< > OmniVision ov5642 camera support
< > OmniVision ov5640 camera support using mipi
修改设备树,屏蔽csi
/* &csi {
status = "disabled";
port {
csi1_ep: endpoint {
remote-endpoint = <&ov5640_ep>;
};
};
}; */
屏蔽csi对应的pinctrl_csi1
/* pinctrl_csi1: csi1grp {
fsl,pins = <
MX6UL_PAD_CSI_MCLK__CSI_MCLK 0x1b088
MX6UL_PAD_CSI_PIXCLK__CSI_PIXCLK 0x1b088
MX6UL_PAD_CSI_VSYNC__CSI_VSYNC 0x1b088
MX6UL_PAD_CSI_HSYNC__CSI_HSYNC 0x1b088
MX6UL_PAD_CSI_DATA00__CSI_DATA02 0x1b088
MX6UL_PAD_CSI_DATA01__CSI_DATA03 0x1b088
MX6UL_PAD_CSI_DATA02__CSI_DATA04 0x1b088
MX6UL_PAD_CSI_DATA03__CSI_DATA05 0x1b088
MX6UL_PAD_CSI_DATA04__CSI_DATA06 0x1b088
MX6UL_PAD_CSI_DATA05__CSI_DATA07 0x1b088
MX6UL_PAD_CSI_DATA06__CSI_DATA08 0x1b088
MX6UL_PAD_CSI_DATA07__CSI_DATA09 0x1b088
>;
}; */
屏蔽 ov5640
/* ov5640: ov5640@3c {
compatible = "ovti,ov5640";
reg = <0x3c>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_csi1>;
clocks = <&clks IMX6UL_CLK_CSI>;
clock-names = "csi_mclk";
pwn-gpios = <&gpio_spi 6 1>;
rst-gpios = <&gpio_spi 5 0>;
csi_id = <0>;
mclk = <24000000>;
mclk_source = <0>;
status = "disabled";
port {
ov5640_ep: endpoint {
remote-endpoint = <&csi1_ep>;
};
};
}; */
屏蔽wdog1
/* &wdog1 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_wdog>;
fsl,ext-reset-output;
}; */
8 裁剪AUDIO
修改menuconfig
Device Drivers --->
<*> Sound card support --->
<*> Advanced Linux Sound Architecture --->
<*> ALSA for SoC audio support --->
SoC Audio for Freescale CPUs --->
< > Asynchronous Sample Rate Converter (ASRC) module support
< > Synchronous Audio Interface (SAI) module support
< > Synchronous Serial Interface module (SSI) support
< > Sony/Philips Digital Interface (S/PDIF) module support
< > Enhanced Serial Audio Interface (ESAI) module support
< > Digital Audio Mux module support
< > SoC Audio for Freescale i.MX CPUs
修改设备树屏蔽sound
屏蔽 sound-wm8960
屏蔽 pinctrl_sai2
屏蔽 &sai2
9 裁剪lcd
屏蔽 pinctrl_lcdif_dat
屏蔽 pinctrl_lcdif_ctrl
屏蔽 pinctrl_pwm1
屏蔽 pinctrl_wdog
屏蔽 &lcdif
屏蔽 &pwm1
屏蔽 &wdog1
10 uart2 复用
屏蔽 UART2_DCE_RTS 与 UART2_DCE_CTS
pinctrl_uart2: uart2grp {
fsl,pins = <
MX6UL_PAD_UART2_TX_DATA__UART2_DCE_TX 0x1b0b1
MX6UL_PAD_UART2_RX_DATA__UART2_DCE_RX 0x1b0b1
/* MX6UL_PAD_UART3_RX_DATA__UART2_DCE_RTS 0x1b0b1
MX6UL_PAD_UART3_TX_DATA__UART2_DCE_CTS 0x1b0b1 */
>;
};
pinctrl_uart2dte: uart2dtegrp {
fsl,pins = <
/* MX6UL_PAD_UART2_TX_DATA__UART2_DTE_RX 0x1b0b1
MX6UL_PAD_UART2_RX_DATA__UART2_DTE_TX 0x1b0b1
MX6UL_PAD_UART3_RX_DATA__UART2_DTE_CTS 0x1b0b1
MX6UL_PAD_UART3_TX_DATA__UART2_DTE_RTS 0x1b0b1 */
>;
};
修改 &uart2 屏蔽 uart-has-rtscts;
&uart2 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_uart2>;
/* uart-has-rtscts; */
/* for DTE mode, add below change */
/* fsl,dte-mode; */
/* pinctrl-0 = <&pinctrl_uart2dte>; */
status = "okay";
};
11 uart3 复用
屏蔽UART2_DCE_RTS与UART2_DCE_CTS
pinctrl_uart2: uart2grp {
fsl,pins = <
MX6UL_PAD_UART2_TX_DATA__UART2_DCE_TX 0x1b0b1
MX6UL_PAD_UART2_RX_DATA__UART2_DCE_RX 0x1b0b1
/* MX6UL_PAD_UART3_RX_DATA__UART2_DCE_RTS 0x1b0b1
MX6UL_PAD_UART3_TX_DATA__UART2_DCE_CTS 0x1b0b1 */
>;
};
pinctrl_uart2dte: uart2dtegrp {
fsl,pins = <
/* MX6UL_PAD_UART2_TX_DATA__UART2_DTE_RX 0x1b0b1
MX6UL_PAD_UART2_RX_DATA__UART2_DTE_TX 0x1b0b1
MX6UL_PAD_UART3_RX_DATA__UART2_DTE_CTS 0x1b0b1
MX6UL_PAD_UART3_TX_DATA__UART2_DTE_RTS 0x1b0b1 */
>;
};
12 定义led管脚
屏蔽 GPIO1_IO03 此管脚当作wifi模块的复位管脚了
pinctrl_tsc: tscgrp {
fsl,pins = <
MX6UL_PAD_GPIO1_IO01__GPIO1_IO01 0xb0
MX6UL_PAD_GPIO1_IO02__GPIO1_IO02 0xb0
/* MX6UL_PAD_GPIO1_IO03__GPIO1_IO03 0xb0 */
MX6UL_PAD_GPIO1_IO04__GPIO1_IO04 0xb0
>;
};
在根节点下创建leds节点
leds {
compatible = "gpio-leds";
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_gpio_leds>;
led1{
label = "sys-led";
gpios = <&gpio3 5 GPIO_ACTIVE_HIGH>;
linux,default-trigger = "heartbeat";
default-state = "on";
};
led2{
label = "tunnel-led1";
gpios = <&gpio3 9 GPIO_ACTIVE_HIGH>;
default-state = "off";
};
led3{
label = "tunnel-led2";
gpios = <&gpio3 8 GPIO_ACTIVE_HIGH>;
default-state = "off";
};
led4{
label = "tunnel-led3";
gpios = <&gpio3 7 GPIO_ACTIVE_HIGH>;
default-state = "off";
};
led5{
label = "wifi_reset";
gpios = <&gpio1 3 GPIO_ACTIVE_LOW>;
default-state = "off";
};
};