Q&A 게시판

물리주소 가상 매핑 후 액세스 안되는 문제

작성자
이승환
작성일
2020-04-19 22:01
조회
147
현재 임베디드 리눅스 포팅하여 타겟 보드인 stm32mp157c-dk2 에 올려서 사용 중에 있습니다.

간단한 LED Toggle 드라이버를 작성을 했습니다.
LED가 물린 GPIO 포트와 PIN number는 PH7, GPIOH Port Controller의 물리 주소는 0x50008000 주소입니다.
이 주소를 ioremap 함수의 인자에 대입하여 변환된 가상 주소를 받아오는 것을 debug를 통해 확인 하였고,
포인터 연산을 통해 Access를 해보았습니다.

그러나 값을 제대로 읽어오지도, 쓰지도 못하는 상황입니다....
허나, 라이브러리를 사용하였을 때는 또 LED Toggle이 원하는 대로 잘 작동이 되네요?
왜 ioremap을 통한 매핑된 주소를 가지고 액세스 하는 부분이 되지 않는 걸까요?

구글링에선 Device Tree 와의 연계를 말하는 자료들이 워낙 많은데 Device Tree를 보게 된지 얼마 안된 터이라 공부가 더 필요합니다..

그리고 첨부한 사진을 보시면 cat /proc/vmallocinfo 를 출력하였을 때 ioremap을 한 결과 할당된 가상 주소의 범위가 매우 이상하게 설정이 되어 있는 것을 확인 하실 수 있습니다.
이게 문제가 될 수도 있을까요?

아 그리고 <코드로 알아보는 ARM 리눅스 커널> 의 저자분이 블로그 주인장 분이시더라구요 책 항상 도움 많이 되고 있습니다. ㅎㅎ
답변 부탁드릴게요 ㅠㅠㅠ 감사합니다.
전체 1
  • 2020-06-23 08:44
    안녕하세요? 답변이 늦어서 죄송합니다.

    GPIO 포트를 제어하는 물리 주소가 0x50008000일 때 이 주소를 ioremap 하는 경우 아래와 같은 형식으로 매핑이 되는 것을 확인할 수 있습니다.

    $ cat proc/vmallocinfo

    0xffffff8008000000-0xffffff8008001000 4096 of_iomap+0x30/0x48 phys=50008000 ioremap

    위의 정보를 해석해보면 다음과 같습니다.
    - 첫 번째 범위는 가상 주소 범위이고,
    - 두 번째는 사이즈 입니다. 1 페이지를 매핑하여 4096 바이트임을 알 수 있습니다.
    - 세 번쨰는 of_iomap으로 시작하므로 디바이스 트리의 정보를 인식하여 매핑함을 알 수 있습니다.
    - 네 번째는 phys=50008000의 물리주소를 나타냅니다.

    당연히 드라이버를 작성하셨으면 위의 가상 주소를 제어하면 정상적으로 동작해야 합니다.

    ------

    만일 libgpiod 같은 유저 라이브러리를 사용해서 동작된다는 말은,
    이승환님이 작성한 드라이버가 동작하기 이전에,
    이미 커널에 내장된 gpio 드라이버가 먼저 이를 제어한다는 의미입니다.

    커널 버전에 따라 다르겠지만, /sys/class/gpio 등의 디렉토리에
    gpiochip**** 파일이 있으면 이미 드라이버가 동작한 것입니다.

    감사합니다.