Linux 장치 구동 개발 - 3.LED 켜기
2821 단어 Linux 장치 구동 개발
3. LED 켜기
앞에서 학습한 바와 같이 우리는 4412를 어떻게 조작하는지 대체적으로 이해했다. 가장 직관적인 부분은 조작 개발판을 통해 LED등을 켜는 것이다.
도구 파일:
E4412_N.bl1.bin: 삼성에서 제공하는,bl1 코드
V310-EVT1-mkbl2.c: 삼성에서 제공하는 BL2 제작 도구(mkbl2) 원본
E4412_tzsw.bin: 삼성에서 제공하는 보안 보안 코드
sd_fusing.sh:삼성에서 제공한 BL1, BL2를SD카드에 적은 스크립트
1. 누드 코드 작성:led.S
.text
.global _start
_start:
LDR R0,=0x110002E0 @GPM4CON
LDR R1,=0x00001111 @GPM4_0--3
STR R1,[R0] @R1 R0,
LDR R0, =0x110002E4 @GPM4DAT
LDR R1, =0x00000001 @GPM4_0 1,LED1 ;LED2 3 4
STR R1,[R0]
MAIN_LOOP: @
B MAIN_LOOP
tiny4412 개발판의, 4개의 LED가 4412 파이프 GPM4에 연결되어 있음0 - GPM43 위
2. Makefile 파일:
led.bin:led.S
arm-linux-gcc -c -o led.o led.S
arm-linux-ld -Tled.lds -N led.o -o led.elf
arm-linux-objcopy -O binary -S led.elf led.bin
arm-linux-objdump -D -m arm led.elf > led.dis
clean:
rm -f *.dis *.bin *.elf *.o
led.elf: 주소 정보 포함
led.bin: 순수 바이너리 파일
led.dis: 어셈블러 파일
3. 스크립트 파일 링크:
SECTIONS {
. = 0x02023400;
.text : { *(.text) }
. = ALIGN(4);
.rodata : {*(.rodata*)}
. = ALIGN(4);
.data : { *(.data) }
. = ALIGN(4);
.bss : { *(.bss) *(COMMON)}
}
여기 0x02023400은 링크 주소입니다.링크 주소는 코드의 시작 저장 주소로 코드가 있어야 할 곳, 즉 코드의 레이아웃을 결정한다.여기서 0x02023400을 지정하면 iRAM (매뉴얼 0x0202000) 에서 실행된다는 것을 표시합니다.사실 LED 코드는 매우 간단합니다. 여기서 우리는 iRAM의 공간을 사용할 수 있고 심지어 iROM 공간 0x2000 을 사용할 수 있습니다.0000, 모두 실행할 수 있습니다. 왜냐하면 우리는 어셈블리 코드이기 때문에 위치는 코드와 무관합니다!0x02023400을 사용하는 이유는 삼성이 정한 BL2의 시작 주소이기 때문이다.
4. 컴파일 및 굽기:
# make 명령을 직접 입력하면 led가 생성됩니다.bin 파일, 그럼 SD카드에 어떻게 태워넣을까요?
여기는 스크립트 파일 sd 를 사용합니다fusing.sh, 명령 사용 #
sd_fusing.sh /dev/sdb.
간단하게 말하자면 이 스크립트 파일은 사실 명령을 실행했다. signed_bl1_position=1
bl2_position=17
uboot_position=49
tzsw_position=705
dd iflag=dsync oflag=dsync if=./E4412_N.bl1.bin of=$1 seek=$signed_bl1_position
dd iflag=dsync oflag=dsync if=./bl2.bin of=$1 seek=$bl2_position
dd iflag=dsync oflag=dsync if=./led.bin of=$1 seek=$uboot_position
dd iflag=dsync oflag=dsync if=./E4412_tzsw.bin of=$1 seek=$tzsw_position
상기 명령의 기능은 바로bl1,bl2,led 누드 코드,비밀 코드를 각각SD카드의 구역 1,17,49,705에 기록하고 우리는 led 누드 코드를 원래의 uboot(bl2를 제외하고
)의 코드, 코드를 실행하면 LED 불을 켤 수 있습니다!
.text
.global _start
_start:
LDR R0,=0x110002E0 @GPM4CON
LDR R1,=0x00001111 @GPM4_0--3
STR R1,[R0] @R1 R0,
LDR R0, =0x110002E4 @GPM4DAT
LDR R1, =0x00000001 @GPM4_0 1,LED1 ;LED2 3 4
STR R1,[R0]
MAIN_LOOP: @
B MAIN_LOOP
led.bin:led.S
arm-linux-gcc -c -o led.o led.S
arm-linux-ld -Tled.lds -N led.o -o led.elf
arm-linux-objcopy -O binary -S led.elf led.bin
arm-linux-objdump -D -m arm led.elf > led.dis
clean:
rm -f *.dis *.bin *.elf *.o
SECTIONS {
. = 0x02023400;
.text : { *(.text) }
. = ALIGN(4);
.rodata : {*(.rodata*)}
. = ALIGN(4);
.data : { *(.data) }
. = ALIGN(4);
.bss : { *(.bss) *(COMMON)}
}
signed_bl1_position=1
bl2_position=17
uboot_position=49
tzsw_position=705
dd iflag=dsync oflag=dsync if=./E4412_N.bl1.bin of=$1 seek=$signed_bl1_position
dd iflag=dsync oflag=dsync if=./bl2.bin of=$1 seek=$bl2_position
dd iflag=dsync oflag=dsync if=./led.bin of=$1 seek=$uboot_position
dd iflag=dsync oflag=dsync if=./E4412_tzsw.bin of=$1 seek=$tzsw_position