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

== Pads 단축키 모음 ==

*Control Key*

Ctrl + A : 설계화면의 모든 요소가 동시에 선택된다.

Ctrl + U : Highlight해제.

Ctrl + B : Board outline 전체를 화면에 표시한다.

Ctrl + Alt + E : View extents와 동일기능.(보드전체보기:Home key와 동일)

Ctrl + V : Ctrl+C로 복사된 요소를 붙여넣기 함.

Ctrl + C : 현재 선택된 요소를 Copy 한다.

Ctrl + W : Zoom mode의 On/Off.

Ctrl + D : Redraw를 실행한다.

Ctrl + X : 선택한 요소를 Delete.

Ctrl + E : 선택된 요소의 이동(Move mode)

Ctrl + F : 부품 배치면의 변경(Flip Side, Top <-> Bottom)

Ctrl + Z : Undo와 동일 기능.

Ctrl + G : Create union

Ctrl + Alt + C : Display colors setup 대화 상자를 Open.

Ctrl + H : Highlight (해제는 Ctrl + U)

Ctrl + Enter : Preference 대화 상자의 Design Tab.

Ctrl + I : Spin mode (부품을 임의 각도로 회전)

Ctrl + J : Route loop

Ctrl + Alt + F : Selection filter 대화 상자을 Open.

Ctrl + L : 선택된 부품이 일렬로 정렬된다.

Ctrl + Alt + J : Add jumper mode.

Ctrl + M : Length minimization

Ctrl + N : New file을 Open한다.

Ctrl + Alt + N : View nets 대화 상자를 Open.

Ctrl + O : File을 Open한다.(Start-up file을 사용하지 않음)

Alt + P : 이전의 화면을 표시(Toggle)

Ctrl + Alt + S : Status window를 Open.

Ctrl + Q : 조회 및 수정 mode(Query/Modify) 선택한 속성확인

Ctrl + R : 부품을 반 시계방향으로 회전

Ctrl + S : Save mode

Ctrl + PageDown : 현재위치를 기준으로 좌표치 계산표시.(Q와 동일)


*Modeless Commands*

[명령을 입력하고 Enter key를 누른다.]

AA: Route 또는 2D line작성시 임의 각도 지원.

AD: Route 또는 2D line작성시 대각선 각도 지원.

AO: Route 또는 2D line작성시 90도 지원

OH: 외곽선을 고해상도로 표시한다.

OL: 외곽선을 사각형으로 표시한다.

C: Plane layer상의 anti-pads와 Thernals를 볼수있다

PO: Pour outline의 On/Off toggle

D: 현재의 작업 Layer를 On/Off 시킨다.

Q: 커서의 현재위치에서 거리측정 mode로 변환

DO: Drill outline을 On/Off시킨다.

R<n>: Real width의 크기를 지정.[r8 : 선폭이 8보다 크면 실제크기로 Display]

DRI: 설계중 Route의 Intersection만을 체크함.

DRP: 설계중 Design rule을 항상 체크함.(DRC ON)

DRO: 설계중 Design rule을 체크하지 않음.(DRC OFF)

S<n><n>: s100 100 : X100, Y100 좌표를 찾는다.[sQ1 : 부품 Q1을 찾는다

sR1.2 : 저항 R1의 2번 Pin을 찾는다.]

SH: Shove mode의 On/Off toggle.

DRW: 부품 배치중에는 Error 메시지 출력, Routing중에는 Design rule을 체크함.

Spacebar: 마우스 왼쪽 버튼과 동일.

E: End via와 End no via사이를 Toggle시킨다.

SPD: Split/mixed planes에 대한 Plane data를 보여준다.

SPO: Split/mixed plane에 대한 plane polygon outline을 표시한다.

SPI: Plane thermal indicator를 표시한다.

F<s>: File의 내용을 화면으로 볼 때

G<xx> => g20 : Design grid를 20으로 설정한다.

GD<xx> => gd20 : Display Grid를 20으로 설정한다.

GR<xx>: Design Grid를 설정한다. GP: Grid를 Radial grid로 변경 및 해제.

SRX<n>: X에 대한 상대위치 검색

SR<n>n<n> => X,Y에 대한 마우스 커서로부터 상대위치를 검색

SRY<n>: Y에 대한 상대위치 검색

SS<s>: ssu1 : Move mode에서 U1을 검색.(Ref Des로 검색)

GV<xx>: Via grid setting

SX<n>: X축의 절대위치로 이동 SY<n>: Y축의 절대위치로 이동

HC: 2D-line mode에서 원 그리기 HH: 2D-line mode에서 직선 그리기

HP: 2D-line mode에서 다각형 그리기 HR: 2D-line mode에서 직사각형 그리기

T: Transparent mode의 ON/Off toggle

UN<n>: 복수개의 Undo 실행(un 5:Undo를 5번 실행)

I: Design database의 Integrity 체크(오류는 삭제됨)

V<NAME>: Via type 선택(예:v standard via)

VA: 자동으로 Via 선택 VT: Through hole via 사용

VP: Partial Via 사용 L<n>: layer 선택

N<s>: s로 지정된 net를 highlight시킨다. [highlight의 해제는 n을 입력하고 Enter를 누른다.]

O<r>: Pad 또는 trace의 외곽선으로 표시한다.(Toggle)

W<n>: Width를 변경(예:w5는 폭을 5로 변경)



온습도를 측정하는 ble장치의 사용전류를 측정해 배터리 사용 시간을 예샹하기 위해 시작

장치 앞단이나 후단에 저항을 달아 저항쪽에 전압을 측정하여 i=v/r식에 적용하여 전류량을 구함

저항은 10R을 사용

해당장치의 경우

1분에 한번 센서값 측정후 ble출력

10초마다 측정했던 센서값 ble출력

해주며 나머지 시간은 sleep상태로 들어가기때문에 실제 동작시간은 매우짧음

오실로스코프를 사용해 전압을 측정후 전류로 변환

sleep시간같은경우는 오실로스코프로 측정하지않고 전류계를 사용해 측정

위에 측정결과를 가지고 1분동안 전체 사용하는 전류를 계산하면

 ((0.01*6)+(0.005*5)+(0.268*1)+(0.015*7.5)+(59.642*0.01))/60=0.0176987mA

배터리 용량이 1200mAh라고 할때 

사용일수는 1200/0.0176987*0.7(소비율)/24=1977.55일

결과적으로 약 5.4년을 사용할수 있다.

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'

끝 정말쉽다!

mii info

mii read 0x00 0x1f

mii write 0x00 0x1f 810B

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 & 명령을 사용하여 재실행 해줍니다.

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

 

+ Recent posts