24.01.04 최초 작성
bcm2711 기준
Pin Direction Register
: input/output 설정
Pull up/Dn Control Register
: GPIO를 Pull up/down 상태로 설정
output
상태로 설정 시
Pin Set & Clear Registers
: output일 시 기본적으로 HIGH/LOW상태로 설정할지 결정input
상태로 설정 시
Low/High Level Detect Enable Register
: 레벨 감지 시 원래 핀 상태를 Low/High로 설정할지 결정Rising/Falling Edge Detect Enable Register
: Sync Edge
감지시 들어오는 신호가 상승/하강 신호일때 Interrupt
Async Rising/Falling Edge Detect Enable Register
: Async Edge
감지시 들어오는 신호가 상승/하강 신호일때 Interrupt
Function Select Register
: 각 포트의 기능을 지정
$cd /sys/class/gpio //sysfs로 이동
$ls
export gpiochip0 gpiochip504 unexport
$echo 17 > export //17번 gpio핀 활성화
$ls
export gpio17 gpiochip0 gpiochip504 unexport
$cd gpio17
$cat direction
in //현재 input으로 설정됨
$cat value
0 //읽은 값은 0
$echo out > direction //output으로 설정
$echo 1 > value //출력값을 1로 설정
read/write
를 통한 제어
devmem 활성화
cat /proc/iomem //메모리 맵을 통해 gpio 주소 확인
mkdir /boot
mount -t vfat /dev/mmcblk0p1 /boot
vi /boot/cmdline.txt //iomem=relaxed 추가
reboot
cat /proc/iomem
에서 확인한 GPIO 영역 0xfe200000~0xfe2000b3
에 위치virtual address
)Function Select Register
설정은 GPFSEL1
레지스터의 23~21
비트를 통해 설정 가능Description
의 내용을 통해 설정에 해당하는 값 확인 가능)GPFSEL1
레지스터 설정은 GPIO memory map
으로 부터 0x04
오프셋을 가지는 위치에 존재virtual address
기준 0xfe200004
에 위치)devmem 0xfe200004 //기존 0xfe200004영역의 값 확인
> 0x00024000
devmem 0xfe200004 32 0x224000 //0xfe200004부터 32비트를 0x224000 (output)으로 설정
0x00024000
에서 23~21
비트에 0b001 (output)
을 설정해주면 0x00224000
됨devmem 0xfe200020
> 0x6770696F
devmem 0xfe200020 32 0x6772696F //GPIO 17번의 기본 상태를 1로 설정
n번 bit
GPIO의 초기 상태를 1로 설정 가능 (GPSET0
은 초기 상태를 0으로 설정)GPSET0
레지스터 설정은 GPIO memory map으로 부터 0x1C
오프셋을 가지는 위치에 존재0x6770696F
에서 17번 비트를 세팅하면 0x6772696F
됨output으로 설정된 GPIO를 초기화
(17번 GPIO를 초기화 하려면 해당 레지스터의 17번 bit를 1로 설정)
GPCLR0
레지스터 설정은 GPIO memory map으로 부터 0x28
오프셋을 가지는 위치에 존재
sudo mount -t debugfs none /sys/kernel/debug
cd /sys/kernel/debug/pinctrl
cat pinctrl-handles
cat pinctrl-maps
cat fe200000.gpio-pinctrl-bcm2711/pinmux-pins
//input, output 설정
int gpio_direction_output(unsigned gpio, int value);
int gpio_direction_input(unsigned gpio);
//gpio를 열고 닫음
int gpio_request(unsigned gpio, const char *label);
void gpio_free(unsigned gpio);
//gpio의 값 세팅
void gpio_set_value_cansleep(unsigned gpio, int value);
void gpio_set_value(unsigned gpio, int value);
//gpio의 값 확인
int gpio_get_value_cansleep(unsigned gpio);
int gpio_get_value(unsigned gpio);
///
gpio : GPIO 핀 번호 지정
value : 세팅할 값
label : open해서