반도체 소프트웨어

코멘토 실무PT 후기 챌린지_"반도체 SW 엔지니어를 위한 새로운 SoC 위에 리눅스 디바이스 드라이버 포팅하기" 강의 4주 차 후기 본문

교육/코멘토 직무PT

코멘토 실무PT 후기 챌린지_"반도체 SW 엔지니어를 위한 새로운 SoC 위에 리눅스 디바이스 드라이버 포팅하기" 강의 4주 차 후기

반도체 소프트웨어 엔지니어 2024. 2. 4. 20:51

<학습 소감>

4주 차는 GPIO를 배웠다. 기존에 라즈베리파이를 사용하여 LED 등 센서와 엑츄에이터를 제어하는 기본적인 실습을 해본 경험이 있어 GPIO 수업은 쉬울 것이라 간과했다. 그러나 하드웨어 관점에서의 GPIO 내부 구조, 가상 에뮬레이터(QEMU) 에서 GPIO 기능 구현에 관한 내용들이 쉽지 않았다. 요번 수업을 통해 GPIO가 소프트웨어적으로 1과 0을 써서 제어하는 범용 핀 이라는 단순한 이해를 넘어서 실제로 어떻게 구현되어있고 제어는 어떻게 하며 MMIO와 DMA와 연계되면 어떤 결과가 나올 수 있는지를 배울 수 있어서 좋았다. 다음 수업이 기대된다.

 

<실습 중>

7-Segment 제어 실습
GPIO 유틸리티 사용 예

 

<이번 주 수업 내용 리뷰>

[2024/01/31(수) 20:00]

  1. 작주 복습
    • DMA
      • memcpy 같은 라이브러리 내부 코드 분석하는 것도 도움이 될듯
      • PIO: 프로그래밍 I/O이고, 이걸 진화시킨게 DMA이다. CPU안거치고 디바이스가 메모리에 직접 접근해서 I/O를 처리
      • DMA는 구현하기 어려움: 속도 효율성, 송수신 제어, 안전성 등 모두 고려해야함
      • 모든 디바이스가 DMA를 사용하게 할 수는 없음: 디바이스가 메모리에 접근함으로써 CPU가 메모리에 접근하는게 중복될수있기에 DMA를 엄청 많이 사용할 수는 없음(그래서 dma 컨트롤러를 따로 사용해야함)
      • dma는 가상주소가 아닌 물리 주소공간을 기반으로 동작
      • 파편화된 물리주소를 가상주소로 합쳐서 쓰게하는것도 가상메모리의 장점
      • 파편화때문에 dma는 스캐더-게더라는 기법을 통해 구현하는것이 원초적
      • 결론적으로는 스캐터 리스트를 게더해서 파편화된 물리메모리공간을 하나의 물리적 주소 공간인것처럼 DMA가 사용하도록 지원하는 것
    • 파일시스템
      • init이 사용할 파일시스템을 마운트함
      • 부트로더가 커널이랑 initramfs를 RAM에 로드하고 커널에게 INITRAMFS 있다고 알려주면 커널이 파일시스템을 마운트함
      • 파일시스템은 MMC로 올리는게 맞음
      • 레귤레이터는 PMIC의 일종
      • mkfs가 곧 포맷임(파티션 포맷)
      • GFP_DMA로 할당하는게 DST, SRC로 설정해야하지않을지
      • vmalloc가 아니라 kmalloc가 되어야하는게 원인으로 보임
  2. GPIO
    • gpio: soc 내부와 외부가 통신할 수 있는 가장 간단한 컴포넌트(mmc, uart도 내외부 통신 가능)
    • spi, i2c는 버스형태로 동작함
    • gpio는 별도의 핀이 존재. 1/0을 전달 가능
      • 컴퓨터는 보통 ON/OFF 를 전압으로 구분
      • + - 가 전압이 있는 상태이다. ++, -- 는 전압이 있는 상태가 아니다
    • 입출력
      • GPIO에서 1과 0은 VCC나 GND에 연결되어있어야 확정할 수 있음
      • 단순히 핀에 스위치를 단다고 해서 1/0을 확정할 수 없음
      • NC상태를 없애기 위해 보통 풀다운 저항을 GPIO에 달아줌
      • 결론: GND에 저항이 붙으면 풀다운 저항
    • 풀다운업은 GPIO를 입력으로 사용시에 설정하는 것임
      • GPIO출력은 하드웨어 내부 논리적 소자 제어를 통해 1/0 출력
      • 전압분배를 통해 결론적으로 GPIO핀에 VCC가 걸리는거임. 그래서 GPIO핀을 다른 것에 연결하고 또 그것을 GND에 연결하면 전류가 흐르는 것임
      • 전류가 흐르면 전압이 걸리게됨
      • gpio 최대 출력 전류는 10~20mA 정도임. 그래서 LED, 릴레이 정도 사용 가능
      • 보통 GPIO는 릴레이에 연결해서 제어함
      • 릴레이 스위치: 전자석 스위치
      • 전자석은 10~20mA만 필요
      • gpio라는 하드웨어가 내부적으로 어떻게 구현되어있는지도 분석하면 도움이 되겠네(다른 soc, 하드웨어들도 마찬가지, 회로도를 봐야함)

[2024/01/31(수) 21:00]

  1. gpio chip
    • gpio는 물리적인 특성이 있음. 그래서 별도의 하드웨어로 구성됨
    • mmio를 사용해서 구성하여 gpio핀을 설정할 수 있음
    • 입력신호를 받도록 설정하거나 출력신호를 보내도록 direction을 설정
    • 신호를 high/low 어떤걸로 보낼지/읽을지 설정 가능 (NC상태를 읽을수있는 GPIO도 있음)
    • 입력 신호를 통해 인터럽트를 발생시키기도함
    • 이것도 결국은 디바이스가 -> GPIO -> GIC -> CPU로 인터럽트 처리되는것임
    • 인터럽트 발생은 GPIO칩에서 하는 것
    • 디바이스 트리에서 #gpio-cells = <2>;
      • 다른 디바이스에서 gpio를 사용할수있기에 사용할 값과 엑티브값을 설정의 2가지를 설정해야하기에 2 셀이 필요
    • 스위치는 입력, 나머지 LED는 출력
    • sysfs는 가상파일시스템(아래 두개를 udev가 읽어서 /dev에 디바이스 파일 만들어줌)
      • /sys/class
      • /sys/device

[2024/01/31(수) 22:00]

  1. 현업에서는 sysfs나 libgpiod 정도 쓰는구나. 사용자 프로그램을 보통 만들지는 않는구나
  2. 현업에서도 7-segment도 많이 사용하긴함
  3. 릴레이는 많이 씀
  4. 스위치 계보: 릴레이 -> 진공관 -> 트랜지스터의 일종이 FET
  5. 최대한 소형화하고 높은 주파수에도 잘 동작하는 스위치
  6. FET는 전기차에서 중요함

 

링크: https://bit.ly/3D9XCOz