GPIO

EEEFFEE·2024년 1월 4일
0

임베디드 리눅스

목록 보기
4/14

24.01.04 최초 작성

1. GPIO 구성

1.1 GPIO control register

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 : 각 포트의 기능을 지정

2 GPIO 설정

2.1 sysfs를 통한 제어


$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로 설정

2.2 Memory mapped I/O를 통한 제어

  • read/write를 통한 제어

  • devmem 활성화


cat /proc/iomem						//메모리 맵을 통해 gpio 주소 확인

mkdir /boot
mount -t vfat /dev/mmcblk0p1 /boot
vi /boot/cmdline.txt				//iomem=relaxed 추가

reboot

2.2.1 GPFSEL 설정

  • cat /proc/iomem에서 확인한 GPIO 영역 0xfe200000~0xfe2000b3에 위치
    (virtual address)

  • 17번 GPIO의 Function Select Register설정은 GPFSEL1레지스터의 23~21비트를 통해 설정 가능
    (Description의 내용을 통해 설정에 해당하는 값 확인 가능)

  • GPFSEL1레지스터 설정은 GPIO memory map으로 부터 0x04오프셋을 가지는 위치에 존재
    (virtual address기준 0xfe200004에 위치)

  • devmem을 통한 레지스터값 설정

devmem 0xfe200004						//기존 0xfe200004영역의 값 확인
> 0x00024000

devmem 0xfe200004 32 0x224000			//0xfe200004부터 32비트를 0x224000 (output)으로 설정

  • 기존 0x00024000에서 23~21비트에 0b001 (output)을 설정해주면 0x00224000

2.2.2 GPSET0 설정


devmem 0xfe200020
> 0x6770696F

devmem 0xfe200020 32 0x6772696F			//GPIO 17번의 기본 상태를 1로 설정

  • n번 bit GPIO의 초기 상태를 1로 설정 가능 (GPSET0은 초기 상태를 0으로 설정)
    (17번 GPIO의 초기값을 1로 하려면 해당 레지스터의 17번 bit를 1로 설정)

  • GPSET0레지스터 설정은 GPIO memory map으로 부터 0x1C오프셋을 가지는 위치에 존재

  • 기존 0x6770696F에서 17번 비트를 세팅하면 0x6772696F

2.2.2 GPCLR0 설정

  • output으로 설정된 GPIO를 초기화
    (17번 GPIO를 초기화 하려면 해당 레지스터의 17번 bit를 1로 설정)

  • GPCLR0레지스터 설정은 GPIO memory map으로 부터 0x28오프셋을 가지는 위치에 존재

2.3 핀 설정 확인


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

2.4 Linux GPIO 디바이스 드라이버


//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해서 

0개의 댓글

관련 채용 정보