pinctrl은 SoC의 각 핀을 어떤 기능과 전기적 상태로 쓸지 결정하는 Devicetree의 설정으로, pinctrl이 zephyr에서 어떤 역할을 하는지, 어떻게 사용하는지, 왜 필요한지 등을 정의해보려 함.
(https://docs.zephyrproject.org/latest/hardware/pinctrl/index.html 참고)
pinctrl의 목적pinctrl, IDE설정, 레지스터 변경 등으로 바꿀 수 없음.pinmux_set(pin, function) 이런식으로 한 레지스터 블록에서 제어함.(pinmux HW를 사용)pinctrl DTS구조pinctrl-<index> / pinctrl-names:pinctrl-<index> 속성 넣음.&uart0 {
pinctrl-0 = <&uart0_default>;
pinctrl-names = "default";
}
&pinctrl {
uart0_default: uart0_default {
group1 {
psels = <NRF_PSEL(UART_TX, 0, 6)>,
<NRF_PSEL(UART_RX, 0, 8)>;
bias-pull-up;
};
};
};
드라이버는 pinctrl_apply_state()로 DTS 정의를 적용
각 보드별 pinctrl노드에 핀 그룹 정의.
하드웨어가 distributed이면, 드라이버가 peripheral마다 핀 정보를 분리해 적용해야 함.
pinctrl: 핀 기능을 정의하는 Devicetree 노드 블럭(보통 &pinctrl로 존재)
pinctrl-0: default 상태에서 사용할 핀 설정 그룹
pinctrl-1: sleep 상태에서 사용할 핀 설정 그룹
pinctrl-names: 각 상태에 대한 이름 정의("default","sleep"등)
psels: Nordic 전용 매크로. 핀 기능을 정의(NRF_PSEL(UART_TX, 0, 14)등)
nRF pinctrl shared properties
bias-disable: pull-up/down 비활성화.(default임. 명시 필요 없음)bias-pull-up: pull-up 저항 활성화bias-pull-down: pull-down 저항 활성화low-power-enable: input buffer disconnected 모드로 변경해서 pin을 low power모드로 변경함.(ChatGPT에선, 입력감지 불가, 출력은 이전값 유지한상태로 변경 불가라는데, 실험이 필요할듯)pinctrl 수정하기(.overlay사용)/ {
chosen {
zephyr,console = &uart1; // console을 uart 1로 변경
};
};
&uart1 {
status = "okay";
};
&pinctrl {
uart1_default_alt: uart1_default_alt {
group1 {
psels = <NRF_PSEL(UART_TX, 0, 14)>,
<NRF_PSEL(UART_RX, 0, 16)>;
};
};
uart1_sleep_alt: uart1_sleep_alt {
group1 {
psels = <NRF_PSEL(UART_TX, 0, 14)>,
<NRF_PSEL(UART_RX, 0, 16)>;
low-power-enable;
};
};
};
&uart1 {
pinctrl-0 = <&uart1_default_alt>;
pinctrl-1 = <&uart1_sleep_alt>;
pinctrl-names = "default", "sleep";
};
DTS 주요 내용
uart1_default_alt, uart1_sleep_alt 2가지 pinctrl을 정의하고, uart1의 모드별 핀 설정으로 사용uart1_sleep_alt를 보면, sleep모드인 경우 저전력 모드로 변경하도록 함.동작은 Chapter 3과 마찬가지로, zephyr,console이 p0.14, p0.16으로 변경됨.