앞서 라즈베리파이를 이용하야 이더캣(EtherCAT) 마스터를 구성할 경우 Realtime 커널 패치를 하는 방법이 있고, 그 외의 방법으로 외부 EtherNet을 사용하는 방법이 있다는 정보를 찾아서 실시간 커널을 지원받지 못하는 시스템에서 해당 장치를 사용할 수 있도록 미리 문서화 해둔 내용이 있어 공개한다.
SPI Ethernet W5500은 디바이스 마트에서 1만원 정도에 구매가 가능하다. 필자는 라즈베리파이에 연결하였기 때문에 라즈베리파이에서는 2개의 이더넷이 잡힌다. 필요하면 하나더 달던지.. 그러면 3개가....
1. SPI Ethernet 적용
1.1. 디바이스의 연결
라즈베리파이의 핀과 구매한 Modue I/O의 핀매핑은 아래의 표를 참조.
1.2. 테스트 대상
테스트 대상 버전은 라즈베리파이 3B+를 이용하였다. 4는 하다 해먹음 안되니까. 그리고 컴파일은 호스트에서 크로스컴파일을 이용하여 관련 파일들을 생성한다.
(1) 라즈베리파이 개발환경 설치
- 커널빌드를 위한 기본 패키지 설치
$ sudo apt-get install git bc $ sudo apt-get install libncurses5-dev libncursesw5-dev |
- 툴체인 설치
$ git clone https://github.com/raspberrypi/tools ~/works/raspberry/tools |
- 컴파일러 환경 설정
당분간 계속 쓰려면 사용자 홈디렉터리의 .basrc에 추가해두면 터미널을 열때마다 자동 적용된다.
$ echo PATH=$PATH:~/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin |
아래는 에디터 없이 .basrc에 추가하는 방법이다.
$ echo PATH=$PATH:~/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin >> ~/.bashrc $ source ~/.bashrc |
(2) 커널 컴파일
- 커널 소스 다운로드
본 문서 작성시점의 최신 커널은 4.19.y이다. 사용하고 있는 라즈베리의 커널 버전이 낮은 경우, 해당 버전을 확인하고 같은 버전의 커널 소스를 받아서 작업하는게 유익
$ cd ~/works/raspberry/ $ git clone --depth=1 --branch rpi-4.9.y https://github.com/raspberrypi/linuxhttps://github.com/raspberrypi/linux |
- 최신버전에서 해보려면 아래처럼
$ cd ~/works/raspberry/ $ git clone --depth=1 https://github.com/raspberrypi/linux |
- 컴파일 환경 변수 설정
$ cd ~/works/raspberry $ mkdir build $ export ARCH=arm $ export CROSS_COMPILE=~/works/raspberry/tools/arm-bcm2708/gcc-linaro-arm-linux-gnue abihf-raspbian-x64/bin/arm-linux-gnueabihf- $ export INSTALL_MOD_PATH=~/works/raspberry/build $ export INSTALL_DTBS_PATH=~/works/raspberry/build |
- 커널 디폴트 설정 적용
라즈베리파이 3b 및 3b+
$ export KERNEL=kernel7 $ cd ~/works/raspberry/linux/ $ make bcm2709_defconfig |
라즈베리파이 4B
$ export KERNEL=kernel7l $ cd ~/works/raspberry/linux $ make bcm2711_defconfig |
- 커널 옵션 변경
$ make menuconfig |
아래의 커널 설정 화면에서 슬래쉬를 눌러 항목검색 표시
wiznet 입력후 엔터
Wiznet 항목 찾은후 다음과 같이 설정
변경된 커널 설정 저장
(4) 커널 컴파일
- 커널컴파일
컴파일러 환경 변수를 등록하지 않은 경우 (필자는 이 방식으로 주로 빌드함)
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs -j4 |
- 앞서 ARCH와 COMPILER를 export로 환경변수 등록한 경우
linux$ mkdir $INSTALL_MOD_PATH/boot linux$ ./scripts/mkknlimg ./arch/arm/boot/zImage $INSTALL_MOD_PATH/boot/$KERNEL.img linux$ cd $INSTALL_MOD_PATH/boot boot$ mv $KERNEL.img kernel7.img |
- 커널 전송
라즈베리파이에 빌드된 커널 전송
linux$ cd $INSTALL_MOD_PATH module $ tar czf ../kernel.tgz * module $ cd .. linux$ scp kernel.tgz pi@<ipaddress>:/tmp |
### 여기서 부터 라즈베리파이에서 실행
- 변경된 커널 설치
~$ cd /tmp /tmp$ tar xzf kernel.tgz /tmp$ cd boot /tmp/boot$ sudo cp -rd * /boot/ /tmp/boot$ cd ../lib /tmp/lib$ sudo cp -dr * /lib/ /tmp/lib$ cd ../overlays /tmp/overlays$ sudo cp -d * /boot/overlays /tmp/overlays$ cd .. /tmp$ sudo cp -d bcm* /boot/ |
- 부트설정
에디터를 이용하여 커널이미지를 선택한다.
$nano /boot/config.txt |
추가할 내용은 아래와 같다.
# Add the following option: kernel=kernel7_w5500.img |
- 리부팅 및 확인
$ uname -r 4.19.59-rt23-v7l+ |
- 디바이스 트리 변경
빌드하느라 고생하셨다.. 사실은 본 가이드 작성시점 이후의 커널에서는 디폴트로 포함이 되어있는거 같다 따라서 오버레이 DTB만 생성 해주면 바로 사용할 수 있다. 그냥 좋은 공부한 샘 치고 넘어가자. 혹시 안되면 해볼 수 도 있는것 아닌가....;;;;
$ vi w5500-overlay.dts /dts-v1/; /plugin/; / { compatible = "brcm,bcm2835"; fragment@0 { target = <&spi0>; __overlay__ { #address-cells = <1>; #size-cells = <0>; status = "okay"; spidev@0 { status = "disabled"; }; spidev@1 { status = "disabled"; }; }; }; fragment@1 { target = <&spi0>; __overlay__ { #address-cells = <1>; #size-cells = <0>; status = "okay"; w5500@1 { compatible = "wiznet,w5500"; reg = <0>; spi-max-frequency = <10000000>; mac-address = [00 08 DC 01 02 03]; interrupts = <22 0x8>; interrupt-parent = <&gpio>; status = "okay"; }; }; }; }; |
dtb 파일 작성이 완료되었으면 컴파일뒤 /boot/overlay 폴더에 복사한다.
# dts compile $ dtc -I dts -O dtb -o w5500-overlay.dtb w5500-overlay.dts # dtb 파일 복사 $ sudo cp w5500-overlay.dtb /boot/overlays/. # config.txt 내용 추가 $ sudo vi /boot/config.txt (내용 추가) dtoverlay=w5500 |
- 마지막으로 동작확인
라즈베리파이를 부팅해서 ifconfig 명령을 입력하면 eth0 말고 추가된 eth1이 표시되어야 한다.
많이 쓰지 않을것 같아 문서에 캡쳐를 그렇게 해두지 않았는데, 이럴때는 조금 아쉽다.
# 라즈베리파이 EtherCAT을 위한 W5500 모듈 적용... 끝.
최근댓글