Linux 시스템 이식: 원래 커널을 개발 보드로 이식

Linux 시스템 이식: 원래 커널을 개발 보드로 이식

1. 원본 커널을 가져와 컴파일합니다.

아톰에서 제공하는 소스코드를 직접 컴파일하고 명령어를 컴파일

#!/bin/sh
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_v7_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j16

컴파일 후 이미지 파일을 가져옵니다.

20220323222600

장치 트리 파일:

20220323214430

둘째, 커널 부트 테스트

네트워크를 통해 보드에서 컴파일된 리눅스 커널을 시작하고 현상을 확인하십시오 네트워크를 통해 서로 ping을 하려면 LAN 아래에 있어야 합니다!

uboot 보드의 bootargs 매개변수를 console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw로 설정합니다.

setenv bootargs console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw

그런 다음 생성된 이미지 파일과 장치 트리를 네트워크에서 부팅하기 위해 FTP 루트 디렉터리에 복사합니다.

cp arch/arm/boot/dts/imx6ull-14x14-evk.dtb ~/linux/tftp/
cp arch/arm/boot/zImage ~/linux/tftp/

개발 보드에 입력

tftp 80800000 zImage
tftp 83000000 imx6ull-14x14-evk.dtb
bootz 80800000 - 83000000

네트워크를 시작하고 시스템이 성공적으로 시작되면 다음 명령을 입력할 수 있습니다.

20220323225238

방금 시작한 루트 파일 시스템은 uboot의 bootargs 환경 변수에 의해 안내되며, 여기서 root=/dev/mmcblk1p2는 EMMC의 파티션 2에 저장될 루트 파일 시스템의 매개변수에 대한 안내입니다. 파일 시스템이 없는 경우 , 시작 실패 루트 파일 시스템 누락으로 인한 커널 패닉

3. 나만의 보드 파일 추가

Punctual Atomic Alpha 보드용 구성 파일 추가

3.1 보드 구성 파일

imx_v7_mfg_defconfig 구성 파일을 arch/arm/configs 아래에 복사하고 자체 구성 파일의 이름인 imx_my_emmc_defconfig로 이름을 지정한 다음 그 안에 있는 자체 커널을 수정하고 구성합니다.

cp arch/arm/configs/imx_v7_mfg_defconfig arch/arm/configs/imx_my_emmc_defconfig

그런 다음 사용할 수 있습니다.

make imx_my_emmc_defconfig

Linux 커널 구성

20220324091622

3.2 보드 장치 트리

arch/arm/boot/dts 디렉토리에서 imx6ull-14x14-evk.dts 사본을 복사하고 자체 보드의 장치 트리로 imx6ull-my-emmc.dts로 이름을 변경하고 나중에 수정합니다.

cp arch/arm/boot/dts/imx6ull-14x14-evk.dts arch/arm/boot/dts/imx6ull-my-emmc.dts

그런 다음 arch/arm/boot/dts/Makefile에서 "dtb-$(CONFIG_SOC_IMX6ULL)" 구성 항목을 찾아 이 구성 항목에 "imx6ull-my-emmc.dtb"를 추가하고 장치 트리를 추가합니다. dts는 dtb 생성을 컴파일합니다.

3.3 컴파일

이전 컴파일 스크립트 수정

#!/bin/sh
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_my_emmc_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j16

스크립트 실행 권한 부여 후 실행하면 아래와 같이 컴파일이 완료되고 성공적으로 컴파일이 됩니다. 위의 커널 설정은 문제 없습니다

20220324093809

zImage 및 장치 트리 .dtb 파일을 tftp 디렉토리에 복사하고 네트워크에서 부팅하고 자체 장치 트리를 로드합니다.

tftp 80800000 zImage
tftp 83000000 imx6ull-my-emmc.dtb
bootz 80800000 - 83000000

성공적으로 시작됨:

20220324101201

네, 중요한 구성 수정

4.1 주 주파수 변경

부팅 시스템의 CPU 주파수를 인쇄하고 작동 주파수 정보는 /sys/bus/cpu/devices/cpu0/cpufreq에 저장됩니다.

20220324102644

파일의 의미는 다음과 같습니다.

  • cpuinfo_cur_freq : 현재 CPU 동작 주파수, CPU 레지스터에서 읽어온 동작 주파수
  • cpuinfo_max_freq : 프로세서가 실행할 수 있는 가장 높은 동작 주파수 (단위: KHz)
  • cpuinfo_min_freq : 프로세서가 실행할 수 있는 최소 동작 주파수 (단위: KHz)
  • cpuinfo_transition_latency : 프로세서가 주파수를 전환하는 데 걸리는 시간 (단위: ns)
  • scaling_available_frequencies : 프로세서가 지원하는 주요 주파수 목록 (단위: KHz)
  • scaling_available_governors : 현재 커널에서 지원하는 모든 거버너 유형
  • scaling_cur_freq : cpufreq 모듈에 의해 캐시된 현재 CPU 주파수를 저장하고 CPU 하드웨어 레지스터를 확인하지 않습니다.
  • scaling_driver : 이 파일은 현재 CPU에서 사용하는 주파수 변조 드라이버를 저장합니다.
  • scaling_governor : 거버너(주파수 조절) 전략, Linux 커널에는 5가지 주파수 조절 전략이 있습니다.
  1. 성능, 최고 성능, 소비 전력에 관계없이 최고 주파수를 직접 사용
  2. 인터랙티브, 처음에 가장 높은 주파수를 직접 사용한 다음 CPU 부하에 따라 천천히 줄입니다.
  3. Powersave, 절전 모드는 일반적으로 가장 낮은 주파수에서 실행되며 시스템 성능이 영향을 받으므로 일반적으로 사용하지 마십시오.
  4. 사용자 공간, 사용자 공간의 빈도를 수동으로 조정할 수 있습니다.
  5. 온디맨드로 부하를 정기적으로 확인한 후 부하에 따라 주파수를 조정하십시오. 부하가 낮을 때 CPU 주파수 감소
  • scaling_max_freq : 거버너(주파수 변조)가 조정할 수 있는 가장 높은 주파수
  • cpuinfo_min_freq : 거버너(주파수 변조)가 조정할 수 있는 가장 낮은 주파수

현재 주파수 인쇄: 792M

20220324103045

CPU가 지원할 수 있는 4가지 스위칭 주파수가 있습니다.

20220324103140

구성 파일에서 작동 주파수를 수정하고 기본 작동 모드를 절전 모드로 변경합니다.

sudo vim arch/arm/configs/imx_my_emmc_defconfig

기본 코드 추가

20220324104627

수정 후 다시 컴파일하고 네트워크에서 시스템 커널을 시작한 다음 시스템의 작동 주파수를 확인하면 198M이 됩니다.

20220324105859

defconfig 파일을 수정하는 것 외에도 작업 주파수를 수정하는 방법은 다음을 사용하여 그래픽으로 구성할 수도 있습니다.

make menuconfig

그래픽 설정 후 설정 파일을 생성하여 컴파일 하는데 두 방법의 결과는 같다.

일반적으로 온디맨드 모드가 사용되며, 하나는 전력을 절약할 수 있고 다른 하나는 열을 줄일 수 있습니다.

위의 작동 주파수 외에도 원하는 프로그램을 실행할 수 있으며 구체적인 수정 사항에 대해서는 언급하지 않겠습니다.일반적으로 원래 공장에서 제공하는 것을 사용할 수 있습니다.

4.2 EMMC 드라이버 수정

Linux 커널 드라이버의 EMMC는 기본적으로 4-wire 모드이며 8-wire 모드만큼 빠르지 않으므로 EMMC 드라이버를 8-wire로 변경했습니다.

20220324110308

EMMC 배선을 수정하고 장치 트리를 직접 수정하고 imx6ull-alientek-emmc.dts 파일을 열고 다음 구성 파일을 넣습니다.

20220324110557

로 변경

20220324110740

그런 다음 dts를 dtb로 별도로 컴파일하십시오.

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- dtbs

시스템을 재부팅

4.3 네트워크 드라이버 수정

Atomic Development Board의 네트워크는 NXP의 공식 네트워크 하드웨어와 다르며 네트워크 PHY 칩이 KSZ8081에서 LAN8720A로 변경되었으며 Linux 커널과 함께 제공되는 네트워크 드라이버를 구동할 수 없으며 수정해야 합니다.

4.3.1 칩 리셋 핀 수정

장치 트리 파일 imx6ull-my-emmc.dts를 열고 다음 코드를 찾아 중복 IO 포트 구성을 삭제합니다.

20220324153156

수정 후:

20220324153357

다음 코드를 삭제하고 GPIO5_IO07 및 GPIO5_IO08을 각각 ENET1 및 ENET2의 리셋 핀으로 설정합니다.

20220324153715

그런 다음 iomuxc_snvs를 찾아 방금 삭제한 두 핀을 재설정 핀으로 구성합니다. 코드는 다음과 같습니다.

20220324154439

4.3.2 네트워크 클럭 핀 구성

imx6ull-my-emmc.dts에는 다음 두 코드가 있습니다.

20220324154640

다음 매개변수를 0x4001b009(두 핀의 전기적 특성 값)로 수정합니다.

4.3.3 노드의 pinctrl-0 속성 수정

다음과 같이 위치를 수정합니다.

20220324154953

이 두 노드 속성을 다음 그림으로 수정하고 위에서 작성한 재설정 기능을 전달합니다.

20220324155519

4.3.4 네트워크 포트 노드 수정 및 재설정 추가

장치 트리 파일에서 fec2의 노드는 쓰기 네트워크 포트의 주소 정보를 가지고 있습니다.

20220324155707

ethernet-phy@ 뒤의 숫자가 PHY 주소이고 ENET1의 PHY 주소가 0
이므로 @ 뒤에 0이 오고 ENET2에 대해서도 마찬가지이므로 0과 1에 해당하는 reg 값을 수정합니다.

20220324160418

두 개의 fec 노드에 리셋 핀을 추가하고 후속 소프트웨어 리셋 사용을 위해 지속 시간을 200ms로 설정합니다.

20220324160319

커널이 해당 드라이버를 찾도록 안내하는 노드에 드라이버 정보 추가

20220324161045

구성이 완료되면 장치 트리를 다시 컴파일하십시오.

4.3.5 네트워크 드라이버 수정

drivers/net/ethernet/freescale/fec_main.c 파일을 열고 fec_probe 함수에 다음 코드를 추가합니다.

20220324163235

정상적인 작동을 보장하기 위해 두 개의 칩을 재설정하는 데 사용되며 다음 코드를 입력하여 그래픽 인터페이스를 엽니다.

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-  menuconfig

인터페이스에서 네트워크 포트 드라이버를 활성화합니다. 경로는 다음과 같습니다.

-> Device Drivers
    -> Network device support
        -> PHY Device support and infrastructure
        	-> Drivers for SMSC PHYs

20220324163623

체크하면 LAN8720 드라이버가 컴파일됩니다.

4.3.6 smsc.c 파일 수정 및 소프트 리셋 추가

Linux에서 LAN8720A의 소프트 리셋은 정상적인 작동을 보장하기 위해 필요합니다.LAN8720A의 드라이버 파일은 drivers/net/phy/smsc.c이며, 이 파일을 수정하면 내부에서 smsc_phy_reset 리셋 기능을 찾을 수 있습니다.

다음 코드로 수정

	//初始化变量
	int err, phy_reset;
	int msec = 1;
	struct device_node *np;
	int timeout = 50000;
	//获取 FEC1 网卡对应的设备节点
	if(phydev->addr == 0) /* FEC1 */ 
	{
    
    
		np = of_find_node_by_path("/soc/aips-bus@02100000/ethernet@02188000");
		if(np == NULL)
		{
    
    
			return -EINVAL;
		}
	}
	//获取 FEC2 网卡对应的设备节点
	if(phydev->addr == 1) /* FEC2 */ 
	{
    
    
		np = of_find_node_by_path("/soc/aips-bus@02000000/ethernet@020b4000");
		if(np == NULL)
		{
    
    
			return -EINVAL;
		}
	}
	//从设备树中获取“phy-reset-duration”属性信息,也就是复位时间
	err = of_property_read_u32(np, "phy-reset-duration", &msec);
	/* A sane reset duration should not be longer than 1s */
	if (!err && msec > 1000)
		msec = 1;
	//从设备树中获取“phy-reset-gpios”属性信息,也就是复位 IO
	phy_reset = of_get_named_gpio(np, "phy-reset-gpios", 0);
	if (!gpio_is_valid(phy_reset))
		return;
	//复位 LAN8720A
	gpio_direction_output(phy_reset, 0);
	gpio_set_value(phy_reset, 0);
	msleep(msec);
	gpio_set_value(phy_reset, 1);
	//处于 Powerdown 模式的时候才会软复位 LAN8720
	int rc = phy_read(phydev, MII_LAN83C185_SPECIAL_MODES);
	if (rc < 0)
		return rc;
	if ((rc & MII_LAN83C185_MODE_MASK) ==MII_LAN83C185_MODE_POWERDOWN) 
	{
    
    
		/* set "all capable" mode and reset the phy */
		rc |= MII_LAN83C185_MODE_ALL;
		phy_write(phydev, MII_LAN83C185_SPECIAL_MODES, rc);
	}
	phy_write(phydev, MII_BMCR, BMCR_RESET);
	/* wait end of reset (max 500 ms) */
	do {
    
    
		udelay(10);
		if (timeout-- == 0)
		return -1;
		rc = phy_read(phydev, MII_BMCR);
	} while (rc & BMCR_RESET);
	return 0;

디바이스 트리와 리눅스 커널을 수정한 후 재컴파일하고 리눅스 커널을 시작하고 ifconfig 명령어를 사용하여 네트워크 카드를 봅니다.

20220324172841

호스트에 Ping, 성공

20220324173007

4.4 수정된 구성 파일 저장

네트워크 드라이버를 수정할 때 그래픽 인터페이스를 통해 LAN8720A 드라이버를 활성화했으며 활성화 후 .config에 다음 코드가 존재합니다.

CONFIG_SMSC_PHY=y

CONFIG_SMSC_PHY=y일 때 드라이버 파일 smsc.c가 컴파일되며, 프로젝트 정리를 위해 make clean을 실행하면 .config 파일이 삭제되므로 파일을 저장하십시오.

  • 그래픽이 아닌

비그래픽 모드에서 생성된 .config 파일의 이름을 imx_my_emmc_defconfig 구성 파일로 직접 변경하고 arch/arm/configs에 저장합니다.

  • 그래픽

생성된 .config 파일의 이름을 그래픽 인터페이스에서 imx_my_emmc_defconfig 구성 파일로 바꾸고 이를 arch/arm/configs에 저장합니다.

V. 이식 요약

  • 원본 커널 소스 코드 가져오기
  • 구성 파일, 장치 트리 파일을 복사하고 컴파일 및 다운로드하여 Linux를 시작할 수 있는지 테스트합니다.
  • 구성 파일 수정
  • 장치 트리 파일 수정(네트워크 포트, EMMC, 직렬 포트 등과 같은 중요한 장치 트리 및 드라이버 파일은 자신의 보드에 맞게 조정)
  • 개발 보드용 zImage 및 장치 트리 파일 컴파일 및 생성
  • 포트 rootfs
  • 꽃을 끝내다

추천

출처blog.csdn.net/qq_45396672/article/details/123717176