산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial Internet of Things >> 사물 인터넷 기술

Linux 장치 드라이버 개발:핀 제어 하위 시스템

편집자 주:임베디드 Linux 커널은 이미 임베디드 시스템에서 중요한 역할을 하고 있으며 사물 인터넷(IoT)의 다양한 요구 사항을 충족하는 데 있어 그 중요성이 점점 커지고 있습니다. 차례로 장치 드라이버는 응용 프로그램과 IoT 장치 자체 간의 중요한 연결을 제공합니다. Linux Device Drivers Development에서 저자 John Madieu는 자세한 설명과 많은 코드 샘플을 결합하여 이러한 드라이버의 개발에 대한 포괄적인 설명을 제공합니다.

이 책의 14장에서 발췌한 내용은 핀 제어 및 GPIO에 초점을 맞추고 있습니다. 이는 맞춤형 하드웨어 장치와 상호 작용하려는 임베디드 시스템 개발자에게 특히 중요한 영역입니다. 이 발췌 부분의 첫 번째 기사에서는 핀 제어 하위 시스템을 소개합니다.

John Madieu의 Linux Device Drivers Development에서 각색


14장. 핀 제어 및 GPIO 하위 시스템
John Madieu 작성

대부분의 임베디드 Linux 드라이버 및 커널 엔지니어는 GPIO를 사용하여 작성하거나 핀 멀티플렉싱을 사용합니다. 핀은 구성 요소의 나가는 라인을 의미합니다. SoC는 핀을 다중화합니다. 즉, 핀에 여러 기능이 있을 수 있습니다. 예를 들어 arch/arm/boot/dts/imx6dl-pinfunc.h의 MX6QDL_PAD_SD3_DAT1은 SD3 데이터 라인 1, UART1의 cts/rts, Flexcan2의 Rx 또는 일반 GPIO.

핀이 작동해야 하는 모드를 선택하는 메커니즘을 핀 먹싱이라고 합니다. 담당하는 시스템을 핀 컨트롤러라고 합니다. 이 장의 두 번째 부분에서는 범용 입력 출력 에 대해 설명합니다. (GPIO ), 이것은 핀이 작동할 수 있는 특수 기능(모드)입니다.

이 장에서 우리는:

핀 제어 하위 시스템

핀 제어 (pinctrl ) 하위 시스템은 핀 muxing을 관리할 수 있습니다. DT에서 특정 방식으로 핀을 다중화해야 하는 장치는 필요한 핀 제어 구성을 선언해야 합니다.

pinctrl 하위 시스템은 다음을 제공합니다.

이 책의 목적은 핀 컨트롤러 드라이버에서 내보내는 기능을 사용하는 것으로 제한되며 핀 컨트롤러 드라이버를 작성하는 방법은 아닙니다.

Pinctrl 및 장치 트리

pinctrl은 핀(GPIO 뿐만 아니라)을 수집하고 드라이버에 전달하는 방법일 뿐입니다. 핀 컨트롤러 드라이버는 DT의 핀 설명을 구문 분석하고 해당 구성을 칩에 적용합니다. 드라이버는 일반적으로 핀 구성 그룹을 설명하기 위해 두 개의 중첩 노드 세트가 필요합니다. 첫 번째 노드는 그룹의 기능(그룹이 사용되는 용도)을 설명하고 두 번째 노드는 핀 구성을 보유합니다.

DT에서 핀 그룹을 할당하는 방법은 플랫폼과 핀 컨트롤러 드라이버에 크게 의존합니다. 모든 핀 제어 상태에는 0에서 시작하여 연속적인 정수 ID가 부여됩니다. 동일한 이름이 항상 동일한 ID를 가리키도록 ID 위에 매핑되는 name 속성을 사용할 수 있습니다.

각 클라이언트 장치의 고유한 바인딩은 해당 DT 노드에 정의해야 하는 상태 집합과 제공해야 하는 상태 ID 집합을 정의할지 여부 또는 제공해야 하는 상태 이름 집합을 정의할지 여부를 결정합니다. 어쨌든 핀 구성 노드는 두 가지 속성을 통해 장치에 할당할 수 있습니다.

다음은 핀 제어 노드와 함께 일부 장치 노드를 보여주는 DT의 일부입니다.

앞의 예에서 핀 구성은 형식으로 제공됩니다. 예:

MX6QDL_PAD_DISP0_DAT15__GPIO5_IO09 0x80000000

MX6QDL_PAD_DISP0_DAT15__GPIO5_IO09는 핀 기능을 나타내며 이 경우 GPIO이며 0x80000000은 핀 설정을 나타냅니다. 이 라인의 경우

MX6QDL_PAD_EIM_D25__UART3_RX_DATA 0x1b0b1

MX6QDL_PAD_EIM_D25__UART3_RX_DATA는 UART3의 RX 라인인 핀 기능을 나타내며 0x1b0b1은 설정을 나타냅니다.

핀 기능은 핀 컨트롤러 드라이버에만 의미 있는 값을 갖는 매크로입니다. 일반적으로 arch//boot/dts/ 에 있는 헤더 파일에 정의되어 있습니다. 예를 들어 i.MX6 쿼드 코어(ARM)가 있는 UDOO 쿼드를 사용하는 경우 핀 기능 헤더는 arch/arm/boot/dts/imx6q-pinfunc.h가 됩니다. 다음은 GPIO5 컨트롤러의 다섯 번째 줄에 해당하는 매크로입니다.

#define MX6QDL_PAD_DISP0_DAT11__GPIO5_IO05 0x19c 0x4b0 0x000 0x5 0x0

은 풀업, 풀다운, 키퍼, 드라이브 강도 등을 설정하는 데 사용할 수 있습니다. 지정 방법은 핀 컨트롤러 바인딩에 따라 다르며 값의 의미는 일반적으로 IOMUX 섹션에 있는 SoC 데이터 시트에 따라 다릅니다. i.MX6 IOMUXC에서는 17비트 미만만 이 용도로 사용됩니다.

이러한 선행 노드는 해당 드라이버별 노드에서 호출됩니다. 또한 이러한 핀은 해당 드라이버 초기화 중에 구성됩니다. 핀 그룹 상태를 선택하기 전에 먼저 pinctrl_get() 함수를 사용하여 핀 제어를 얻고, 요청한 상태가 있는지 여부를 확인하기 위해 pinctrl_lookup_state()를 호출하고, 마지막으로 상태를 적용하기 위해 pinctrl_select_state()를 호출해야 합니다.

다음은 pincontrol을 가져오고 기본 구성을 적용하는 방법을 보여주는 샘플입니다.

일반적으로 드라이버 초기화 중에 이러한 단계를 수행합니다. 이 코드의 적절한 위치는 probe() 함수 내에 있을 수 있습니다.

pinctrl_select_state()는 내부적으로 pinmux_enable_setting()을 호출하고, 이는 차례로 핀 제어 노드의 각 핀에서 pin_request()를 호출합니다.

pinctrl_put() 함수로 핀 컨트롤을 해제할 수 있습니다. API의 리소스 관리 버전을 사용할 수 있습니다. 즉, pinmux를 구성하기 위해 선택할 상태의 이름이 주어지면 pinctrl_get_select()를 사용할 수 있습니다. 이 기능은 다음과 같이 include/linux/pinctrl/consumer.h에 정의되어 있습니다.

정적 구조체 pinctrl *pinctrl_get_select(구조 장치 *dev,
const char *name)

여기서 *name은 pinctrl-name 속성에 작성된 상태 이름입니다. 상태 이름이 default 인 경우 pinctl_get_select() 주변의 래퍼인 pinctr_get_select_default() 함수를 호출하면 됩니다.

정적 구조체 pinctrl * pinctrl_get_select_default(
struct device *dev)
{
return pinctrl_get_select(dev, PINCTRL_STATE_DE
}

보드별 dts 파일(am335x-evm.dts)에서 실제 예를 살펴보겠습니다.

dcan1:d_can@481d0000 {
상태 ="좋음";
pinctrl-names ="기본값";
pinctrl-0 =<&d_can1_pins>;
};

그리고 해당 드라이버에서:

pinctrl =devm_pinctrl_get_select_default(&pdev->dev);
if (IS_ERR(pinctrl))
dev_warn(&pdev->dev,"핀이 드라이버에서 구성되지 않았습니다.");

핀 제어 코어는 장치가 프로브될 때 자동으로 기본 pinctrl 상태를 요구합니다. 초기화 상태를 정의하면 pinctrl 코어는 자동으로 probe() 함수 이전에 pinctrl을 이 상태로 설정하고 probe() 이후에 기본 상태로 전환합니다(드라이버가 이미 상태를 명시적으로 변경하지 않는 한).

다음 기사에서는 GPIO 하위 시스템에 대해 설명합니다.

Packt Publishing의 허가를 받아 재인쇄했습니다. 저작권 © 2017 팩트 퍼블리싱


John Madieu는 프랑스 파리에 거주하는 임베디드 Linux 및 커널 엔지니어입니다. 그의 주요 활동은 자동화, 운송, 의료, 에너지 및 군대와 같은 영역의 회사를 위한 드라이버 및 BSP(보드 지원 패키지) 개발로 구성됩니다. John은 컴퓨터 온 모듈 및 임베디드 Linux 솔루션을 기반으로 하는 전자 기판 설계의 선구자인 프랑스 회사인 EXPEMB에서 근무하고 있습니다. 그는 오픈 소스 및 임베디드 시스템 애호가이며 지식을 공유해야만 더 많은 것을 배울 수 있다고 확신합니다.


사물 인터넷 기술

  1. 산업용 IoT의 보안 취약점 해결
  2. 현대 플라스틱 개발
  3. 산업용 IoT 개발 전망
  4. 커넥티드 카의 책임자는 누구인가요? 루프에서 드라이버에게 물어보세요
  5. IoT에서 임베디드 시스템을 보호하기 위한 6단계
  6. 제품 개발에서 SaaS의 전환점(2부)
  7. 제품 개발에서 SaaS의 전환점:1부
  8. 적절한 IoT 개발 공급업체 선택의 어려움
  9. 복잡한 제어의 IPC 요구 사항
  10. 성공적인 기업 IoT 개발의 핵심 동인은 무엇입니까?