Raspberry |
◉sysfs를 이용한 GPIO 제어(P.474)
- sysfs
- sys 파일 시스템
- GPIO 포트의 설정과 제어가 가능하다.
- 명령어로 제어가 가능하다.
- 프로그램적으로 하지 않으면 기능에 대해 제한이 있다.
●GPIO 활성화
- 기본적으로 제공하는 파일과 활성화 과정은 다음과 같다.
- 활성화된 GPIO 내부는 다음과 같다.
●GPIO 제어
●GPIO 실습 결과(LED)
- 위의 사진에 마지막 입력인 echo "1"에 대한 결과이다.
◉커널 빌드와 디바이스 드라이버(P.478)
- 리눅스 커널은 리눅스 커뮤니티가 배포한다.
- 누군가 껍데기를 씌워서 보급하는 것을 커널 배포판이라 한다.
- 처음에 설치하면, 아무것도 없다.
- A라는 회사가 커널을 다운 받아서 거기에 더불어 몇 가지 파일(메모장, 계산기 등)을 추가로 묶는다.
- 그 중에 하나가 데비안이다.
- 이것을 기반으로 만든 것이 라즈비안이다.
- GPL 라이선스
- 리눅스 사용은 무료지만, 사용한 소스를 공개에 대한 의무이다.
- gcc나 gcc의 헤더 등을 사용할 경우 해당한다.
- 이것을 사용하지 않으면, GPL 라이선스에 해당하지 않는다.
- 이것을 피한 것이 안드로이드이다.
- 소스 코드 공개의 의무가 없다.
●ARM 컴파일러 설치(P.479)
- 우리는 gcc를 사용하기 때문에 필요없으므로 점프한다.
●커널 소스 다운로드(P.492)
- git 명령어
- 반드시 특정 경로에 이동해서 실행해야 한다.
- 현재 경로에 설치되기 때문이다.
●커널 빌드(P.493)
- 총 1~7단계까지가 있다.
- 데스크톱에서 사용될 커널에 대한 빌드가 아니면 5~7단계의 명령은 사용되지 않는다.
- 1단계
- # make mrproper
- 기존의 커널 설정 내용을 초기화한다.
- 2단계(config)
- config 파일만 모아둔 디렉토리가 존재한다.
- /usr/src/linux/arch/arm/configs
- # make config
- 텍스트 기반의 커널 설정
- # make oldconfig
- 이전 설정 내용을 기반을 커널 설정
- # make menuconfig
- ncurses 라이브러리 텍스트 GUI모드에서 커널 설정
- # make xconfig
- QT 기반의 커널 설정
- # make gconfig
- QTK+ 기반의 커널 설정
- # make PLATFORM_defconfig
- 특정 플랫폼에 대한 기본 설정 파일을 기반으로 커널 설정
- 공식 홈페이지에 따라 Raspberry Pi2는 bcm2709_defconfig를 선택해야 한다.
- 3단계
- # make
- 커널 컴파일 + 모듈 컴파일
- # make all
- 커널 컴파일 + 모듈 컴파일
- # make zimage
- 커널만 컴파일
- # make image
- 라즈베리 파이용 커널 이미지
- 4단계
- # make modules
- 모듈만 컴파일
- 5단계
- # make modules_install
- 모듈 설치
- 컴파일에서 만들어만 졌을 뿐, 설치한 것은 아니다.
- 보통은 4단계 까지 진행하고, 라즈베리 파이에 복사해서 남은 과정을 진행한다.
- 6단계
- # make install
- 브트로더 수정
- 7단계
- # make reboot
- 재부팅
●모듈 프로그래밍(P.507)
- 커널 기초 코드
- <main3.c>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
int simple_mod_init(void)
{
printk("simple module loaded\n");
return 0;
}
int simple_mod_exit(void)
{
printk("simple module unloaded\n");
return;
}
module_init(simple_mod_init);
module_exit(simple_mod_exit);
MODULE_LICENSE("GPL");
|
cs |
- <makefile>
1
2
3
4
5
6
7
8
9
10
|
obj-m := main3.o
KDIR := /usr/src/linux
PWD := $(shell pwd)
all:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
clean:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) clean
|
cs |
- make 결과
●lsmod(P.511)
- 커널 모듈의 목록을 보여준다.
●insmod A.ko(P.511)
- A 모듈을 적재한다.
●rmmod A(P.511)
- A 모듈을 제거한다.
●modprobe A(P.511)
- A에 해당하는 모듈과 이 모듈과 의존성을 가진 모듈을 포함해서 적재한다.
●modprobe -r A(P.511)
- A에 해당하는 모듈과 이 모듈과 의존성을 가진 모듈을 포함해서 제거한다.
●depmod(P.511)
- 사용 가능한 모든 모듈들에 대한 의존성 테이블을 갱신한다.
●insmod, rmmod 실습
- insmod와 rmmmod 및 커널에 적재된 위치를 확인할 수 있다.
●디바이스 드라이버 프로그래밍(P.517)
- file_operations 구조체
- 포인터 구조체
- 대부분이 함수포인터이다.
- APP은 파일 이름만 알면 사용할 수 있다.
●file_operations 구조체(open, release, read, write, ioctl, mmap, poll)(P.519)
- open
- 디바이스 드라이버가 실제로 사용되기 위해 호출하는 함수이다.
- int (*open) (struct inode *, struct file *)
- release
- 장치 드라이버의 사용이 종료될 때 호출되는 함수이다.
- close를 호출하면 이 함수 동작한다.
- int (*release) (struct inode *, struct file *)
- read
- 디바이스에 대한 입력을 위해 사용되는 함수이다.
- ssize_t (*read) (struct file *, char *, size_t, loff_t *)
- write
- 디바이스에 대한 출력을 위해 사용되는 함수이다.
- ssize_t (*write) (struct file *, const char *, size_t, loff_t *)
- ioctl
- read/write 이외의 다양한 연산을 드라이버에서 제공한다.
- int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long)
- mmap
- 하드웨어의 주소 공간을 사용자 영역의 주소 공간으로 매핑하는 함수이다.
- int (*mmap) (struct file *, struct vm_area_struct *)
- poll
- 인터럽트의 처리와 연관되어 사용하는 함수이다.
- 특정 디바이스에 감시하고자 하는 이벤트를 설정하고, 발생 시 커널에게 알려준다.
- unsigned int (*poll) (struct file *, struct poll_table_struct *)
ASSEMBLY |
◉7. String Operations(P.231)
●7.4 Converting a 2`s Complement Integer to an ASCII String.(P.261)
- 아스키 코드 만드는 법
◉8. Bit Manipulation(P.267)
●8.1 Logical Operations(P.268)
- 연산에 메모리가 개입되면 속도가 상대적으로 느려진다.
●and, or, xor, not(P.268)
●and, or, xor, not 예제(P.270)
●test(P.274)
- test의 기능은 연산 후에 다시 대입하지 않는 것을 제외하면, bit &(and)와 유사하다.
- compare. 즉 두 값이 같은지 다른지를 비교할 때 사용한다.
- 연산의 결과가 ZF를 건드린다.
- 플래그를 통해 0인지 1인지를 test 한다.
- test dx, 2000h
- dx의 값과 상관없이 dx의 13번 bit의 값을 0인지 1인지 알아 낼 수 있다.
●8.2 Shift and Rotate Instructions(P.278)
- 쉬프트에 관한 명령어들이다.
●shl, shr, sal, sar(P.279)
- shl : Shift (logical) Left
- 왼쪽으로 값 만큼 Shift하고 0으로 채운다.
- shr : Shift (logical) Right
- 오른쪽으로 값 만큼 Shift하고 0으로 채운다.
- sal : Shift Arithmetic Left
- 왼쪽으로 값 만큼 Shift하고 0으로 채운다.
- sar : Shift Arithmetic Right
- 오른쪽으로 값 만큼 Shift하고 음수면 1, 양수면 0으로 채운다.
●shl, shr, sal, sar 예제(P.280)
●Shift and rotate instructions(P.282)
●shld, shrd(P.286)
- 인자가 3개이다.
- shift한 자리에 인자에 든 값을 밀어 넣는다.
#수정 사항 댓글 달아주세요 ^^
'기술자료 > Linux' 카테고리의 다른 글
우분투 SSH 설치 및 활성화 ubuntu ssh installation (0) | 2021.06.16 |
---|---|
버추얼 박스 최신 버전 다운로드 및 설치 VirtualBox 6.1.22 144080 Win installation (0) | 2021.06.16 |
리눅스 터미널 프로그래밍 (0) | 2016.03.31 |
Linux gcc ASLR 해제 ( 랜덤 스택 Random Stack ) (1) | 2016.03.31 |
mmu.c 분석 시 참조 사이트 (0) | 2013.10.10 |
Serial 통신 ( RS232C ) 수업 자료 (0) | 2013.09.13 |
Linux C에서 write 함수를 이용한 화면 지우기 (2) | 2013.07.11 |
pthread API 정리 (0) | 2013.07.09 |