본문 바로가기
기술자료/Linux

2015.11.03 - 권오민 - sys를 이용한 GPIO 제어/커널 빌드/file_operations 구조체/Bit Manipulation

by 알 수 없는 사용자 2015. 11. 3.
728x90
반응형

 

Raspberry

sysfs를 이용한 GPIO 제어(P.474)

- sysfs

- sys 파일 시스템

- GPIO 포트의 설정과 제어가 가능하다.

- 명령어로 제어가 가능하다.

- 프로그램적으로 하지 않으면 기능에 대해 제한이 있.

GPIO 활성화

- 기본적으로 제공하는 파일과 활성화 과정은 다음과 같다.

- 활성화된 GPIO 내부는 다음과 같다.

GPIO 제어

●GPIO 실습 결과(LED)

- 위의 사진에 마지막 입력인 echo "1"에 대한 결과이다.

 

커널 빌드와 디바이스 드라이버(P.478)

- 리눅스 커널은 리눅스 커뮤니티가 배포한다.

    - 누군가 껍데기를 씌워서 보급하는 것을 커널 배포판이라 한다.

        - 처음에 설치하면, 아무것도 없다.

        - A라는 회사가 커널을 다운 받아서 거기에 더불어 몇 가지 파일(메모장, 계산기 등)을 추가로 묶는다.

    - 그 중에 하나가 데비안이다.

        - 이것을 기반으로 만든 것이 라즈비안이다.

- GPL 라이선스

    - 리눅스 사용은 무료지만, 사용한 소스를 공개에 대한 의무이다.

    - gccgcc의 헤더 등을 사용할 경우 해당한다.

        - 이것을 사용하지 않으면, 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 Pi2bcm2709_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 실습

- insmodrmmmod 및 커널에 적재된 위치를 확인할 수 있다.

디바이스 드라이버 프로그래밍(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의 값과 상관없이 dx13bit의 값을 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한 자리에 인자에 든 값을 밀어 넣는다.

 

 

 

 

 

 

 

 

 

#수정 사항 댓글 달아주세요 ^^

 

 

 

728x90