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 감지시 들어오는 신호가 상승/하강 신호일때 InterruptFunction 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해서
