1.우선 깃허브에서 자료 받기

git clone https://github.com/davidsblog/rCPU

2.rCPU 디렉토리로 접근해서 설치하기

cd rCPU/rCPU/

sudo make install

3. 라즈베리파이 아이피:8111포트로 접속해서 확인해보기 ex) 192.168.0.9:8111

 

너무 편하다

원래 리눅스에서 GPIO를 제어하려면 아래와 같이 해주면된다.

emu0, GPIO3_7번핀은 103번핀이므로 gpio103번을 활성화 시키고

echo out/in 으로 입력으로 쓸건지 출력으로 쓸건지 설정하고

입력인 경우 1/0으로 high/low를 설정할 수 있다.

echo 103 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio103/direction
echo 1 > /sys/class/gpio/gpio103/value
echo 0 > /sys/class/gpio/gpio103/value

 

하지만 emu기능이 있는핀은 이걸해도 설정은 되는데 동작이 안된다 .

LED가 안켜지는 것이다. 대체왜???

검색해보니 이런 문서가 있다.

EMU[1:0] 는 WARMRSTn 신호가 Falling edge후에 190ns 안에 high가 되도록 디자인 되어야 된다고 한다.

나는 이게 무슨이야기인지 자세히는 알수없지만 EMU핀같은 경우 특별한 설정이 필요할 것으로 보였고 더 찾아보니

디바이스 트리파일을 수정해서 해당핀의 모드를 처음부터 GPIO 설정해주면 된다고 한다.

 

나같은경우 beaglebone-black을 사용중이므로

KERNEL/arch/arm/boot/dts/am335x-boneblack.dts 이파일을 수정해주었다.

/* led_gpio */
	led_gpio_pins: led_gpio_pins {
		pinctrl-single,pins = <
			AM33XX_IOPAD(0x9e4, PIN_OUTPUT_PULLDOWN | MUX_MODE7) /* emu0.gpio3_7 */
			AM33XX_IOPAD(0x9e8, PIN_OUTPUT_PULLDOWN | MUX_MODE7) /* emu1.gpio3_8 */
		        >;
		};

처음에는 pinmux부분에 이함수를 추가해서 시도해보았는데 새로만든 함수여서 그런지 적용이 되지않았다.

이걸 사용하게 추가하는 부분이 있는거 같은데 아직 못찾아서

/* eMMC_RSTn */
	emmc_rstn_pins: emmc_rstn_pins {
		pinctrl-single,pins = <
			AM33XX_IOPAD(0x82c, PIN_OUTPUT_PULLDOWN | MUX_MODE7)	 /* gpmc_ad11.GPIO2_27 */
		>;
	};
    
    //기존에 있던 위에 함수에 3문장을 추가해주었다.
    /* eMMC_RSTn */
	emmc_rstn_pins: emmc_rstn_pins {
		pinctrl-single,pins = <
			AM33XX_IOPAD(0x82c, PIN_OUTPUT_PULLDOWN | MUX_MODE7)	 /* gpmc_ad11.GPIO2_27 */
			AM33XX_IOPAD(0x9e4, PIN_OUTPUT_PULLDOWN | MUX_MODE7) /* emu0.gpio3_7 */
			AM33XX_IOPAD(0x9e8, PIN_OUTPUT_PULLDOWN | MUX_MODE7) /* emu1.gpio3_8 */
			AM33XX_IOPAD(0x9b0, PIN_OUTPUT_PULLDOWN | MUX_MODE7) /* emu2.gpio0_19 */

		>;
	};

이런식으로 기존에 있던함수에 내가 설정하려는 핀을 추가해주고 부팅해보니 정상적으로 GPIO가 동작한다.!!!

 

*******dts파일 컴파일하는 방법******

https://sizzf.tistory.com/?page=3

아니면 dts폴더에 아래의 쉘파일을 넣어준뒤에 실행해도 된다.

build_dts.sh
0.00MB

cat /sys/kernel/debug/gpio

cat /sys/kernel/debug/gpio

u-boot에서 mii의 특정 레지스트를 수정한뒤 리눅스를 부팅하고싶어 찾아본 방법입니다.

 

우선 pri명령어를 쳐서 환경변수 목록을 확인해봅니다.

여러가지나오는데 그중에 bootcmd라는 변수가 부팅될때 실행할 커맨드들이 저장되어있는 환경변수입니다.

이걸 수정해서 시작될때마다 적용될수 있게 시도해봤습니다.

setenv bootcmd 'mii write 0x00 0x1f 810B; run findfdt; run mmcboot; setenv mmcdev 1; setenv bootpart 1:2; run mmcboot; run nandboot'

#여기서 bootcmd 뒤에 '' 이거 안해주면 바로 실행되어 버립니다. 주의!

saveenv #환경변수 저장


setenv bootcmd 'mii write 0x00 0x1f 010B; mii write 0x04 0x1f 010B; run findfdt; run mmcboot; setenv mmcdev 1; setenv bootpart 1:2; run mmcboot; run nandboot'

끝 정말쉽다!

am3358 임베디드 리눅스 보드사용중에 기가랜으로 인터넷이 연결되지 않고 100m으로만 되는 문제가있어

계속 찾아보던중

 

이런 내용을 발견하였고 내부클럭 지연모드를 활성화하는 방법에 대해 찾아보니

https://ethernetfmc.com/rgmii-interface-timing-considerations/ 이런 링크를 찾을수 있었다.

디바이스 트리에 내용을 수정하여 간단히 변경할수 있는것 같았는데 애초에 디바이스 트리가 뭔지 모르는 상태여서 한참동안 찾아보았다.

리눅스 부팅을 위해서 디바이스 정보들을 바이너리 형태로 저장해둔 것이라고 하는데 수정은 어떻게 해야할까?

우선 dtc (device tree compiler)를 설치해야한다.

sudo apt install device-tree-compiler

컴파일러가 설치되고나면 dtb파일이 있는 디렉토리로 이동한다. 작성자는 beaglebone-black을 사용

cd KERNEL/arch/arm/boot/dts/

해당 디렉토리로 이동한뒤에 바이너리 상태로 있는 am335x-boneblack.dtb파일을 dts파일로 변환해준다.

dtc -I dtb -O dts -o am335x-boneblack.dts am335x-boneblack.dtb
#                    <output file>        <input file>

이제 dts파일을 수정해준다.

phy-mode 를 rgmii-id로 바꿔 내부지연모드로 변경하였다.

그럼이제 dtb파일로 다시 컴파일 해준다.

dtc -I dts -O dtb -o am335x-boneblack.dtb am335x-boneblack.dts

 이렇게 만든 디바이스 트리를 sd카드의 boot부분에 복사해주면 된다.

 

이걸 적용했지만 여전히 기가랜안된다. 하하

 

******************************************

IDE=<your-device-name> //am335x-boneblack

SRC=$IDE.dts

TMP=$IDE.tmp.dts

DST=$IDE.dtb

cpp -nostdinc -I include -undef -x assembler-with-cpp $SRC > $TMP

dtc -O dtb -b 0 -o $DST $TMP rm $TMP

 

 

 

 

라즈베리파이에서 rc.local를 이용해 자동실행등록했던 프로그램이 어떠한 오류로 꺼지는 경우가 생겼습니다.

해당 프로그램이 꺼졌을때 그것을 판단하여 자동으로 다시 켜주는 기능이 있었으면 좋겠다 생각하여 간단히 쉘스크립트를 이용하여 시도해 보았습니다.

#!/bin/bash

while [ 1 ]
	do
		pid=`ps -ef | grep "uart_receive" | grep -v 'grep' | awk '{print $2}'`

		if [ -z $pid ];then
			if [ $count -lt 10 ];then
				echo "uart_receive start"
				sudo /home/pi/./uart_receive.py &
				sudo home/pi/./time.sh &
		fi
		sleep 2
	done

실행중인 프로세스 이름중에 "uart_receive"가 포함되어있는 프로세스가 있는지를 찾습니다.(2초마다)

해당 프로세스가 검색되지 않으면 sudo /home/pi/./uart_receive.py & 명령을 사용하여 재실행 해줍니다.

간단하지만 꽤 유용하게 사용중입니다.

 

라즈베리파이를 이용해 간단한 iot장치를 만들면서 키자마자 자동실행되도록 하기위해 찾아봤던 방법입니다.

1. 관리자 권한으로 rc.local에 접근

sudo nano /etc/rc.local

커서부분에 실행명령어 입력

2. exit 0 위에부분에 실행시킬 명령어를 입력

ex)


실행시킬 명령어는 &표시를 사용해 백그라운드로 실행해주세요

3. 저장하고 재부팅후 확인

 

정말쉽다

 

리눅스에서 c파일을 컴파일하다보면 여러개를 계속해서 해줘야하는 불편함을 느껴 본적 있을 텐데요.

그럴때 쓰는 것이 MAKE파일입니다.

MAKE는 소스 프로그램 하나씩 수작업으로 처리하는 번거로움을 줄여주는 것으로 자동적으로 재컴파일 하고 

링크해주는 것입니다.

make도구를 이용할 때 가장 중요한 파일은 Makefile 인데 이것을 작성하는 규칙은 아래와 같습니다.


대상(TARGET)...:의존하는 파일들(PREREQUISTITES).......

명령(COMMAND)

....

....

....

만약 소스 및 생성 파일이 아래와 같은 의존관계를 가지고 있으면

의존관계는 이렇게 표현할수 있습니다.

foobar : main.o foo.o bar.o

main.o : main.c

foo.o : foo.c

bar.o : bar.c

그럼 이걸 이용하여 makefile을 만들어 볼까요?

foobar : main.o foo.o bar.o

gcc -o foobar main.o foo.o bar.o

main.o : main.c

gcc -c main.c

foo.o : foo.c

gcc -c foo.c

bar.o : bar.c

gcc -c bar.c

clean : //이 명령어를 실행하려면 터미널에 make clean를 입력하면 됩니다.

rm -f foobar main.o foo.o bar.o


만든 make파일을 실행하려면 터미널에 make라고 입력해주면 컴파일이 자동으로 됩니다.


+ Recent posts