디지털 I/O 사용


디지털 I/O 상태 읽기

디지털 I/O 상태를 읽을 때에는 pid_read함수를 사용하여 모든 포트의 상태를 한 번에 읽거나, pid_ioctl함수의 get명령을 사용해 단일 포트 정보를 읽습니다. 단일 포트 정보의 경우에는 입/출력 상태뿐만 아니라 설정 유형까지 읽을 수 있습니다.

pid_read($pid, VALUE); // 모든 포트 상태 읽기(32 bits 단위)
pid_ioctl($pid, "get N ITEM"); // 단일 포트 정보 읽기(1 bit 단위)

단일 포트 정보 읽기에서 사용 가능한 ITEM은 다음과 같습니다.

ITEM 설명
mode 해당 포트의 설정 유형을
문자열 형태로 반환
입/출력 핀: "in", "out", "led_xxx" 등
UART, SPI 및 I2C가 사용중인 핀: "hdev"
ST 출력으로 사용중인 핀: "st_out"
input 해당 입력포트의 상태를 정수 형태로 반환 (0: LOW, 1: HIGH)
output 해당 출력포트의 상태를 정수 형태로 반환 (0: LOW, 1: HIGH)

여러 포트 상태 읽기 예

아래 예제는 UIO0의 여러 포트를 입력포트(풀업)로 설정한 후 그 상태 값을 읽어서 출력합니다.

<?php
$value = 0;
$pid = pid_open("/mmap/uio0");         // 디지털 I/O 열기
pid_ioctl($pid, "set 0-7 mode in_pu"); // 디지털 I/O 0~7번 입력(풀업) 설정
pid_read($pid, $value);                // 디지털 I/O 상태 읽기(32bits 단위)
printf("0x%x\r\n", $value);            // 출력 결과 예: 0xffffffff
?>

단일 포트 정보 읽기 예

아래 예제는 UIO0의 0번 포트를 기본 상태가 HIGH인 출력포트로 설정하고 설정 유형 및 출력 상태를 읽어서 출력합니다.

<?php
$pid = pid_open("/mmap/uio0");             // 디지털 I/O 열기
pid_ioctl($pid, "set 0 mode out high");    // 0번 포트 출력 설정(HIGH)
$mode = pid_ioctl($pid, "get 0 mode");     // 0번 포트 설정 유형 확인
$output = pid_ioctl($pid, "get 0 output"); // 0번 포트 출력상태 확인
printf("%s, %d\r\n", $mode, $output);      // 출력 결과: out, 1
?>

※ pid_ioctl의 get명령으로 단일포트의 상태를 읽을 때 해당 포트의 유형이 입력포트인 경우에는 "get N input"을, 출력포트인 경우에는 "get N output"을 사용해야 합니다.

디지털 I/O에 값 쓰기

디지털 I/O에 값을 출력하기 위해서는 pid_write함수를 사용하여 여러 포트에 한번에 출력하거나, pid_ioctl함수의 set명령을 사용해 단일 포트로 출력합니다.

pid_write($pid, VALUE); // 여러 포트 출력(32 bits 단위)
pid_ioctl($pid, "set N output TYPE"); // 단일 포트 출력(1 bit 단위)

여러 포트 출력 예

아래 예제는 UIO0의 여러 포트를 출력포트로 설정한 후 임의의 값을 쓰고, 다시 디지털 I/O의 상태를 읽어 출력하는 예제 입니다.

<?php
$value = 0;
$pid = pid_open("/mmap/uio0");                       // 디지털 I/O 열기
pid_ioctl($pid, "set 0-7 mode out");                 // 디지털 I/O 0~7번 출력 설정
pid_read($pid, $value);                              // 디지털 I/O 상태 읽기
pid_write($pid, ($value & 0xffffff00) | 0x00000055); // 0x00000055 출력
pid_read($pid, $value);                              // 디지털 I/O 상태 읽기
printf("0x%08x\r\n", $value);                        // 출력 결과 예: 0x00000055
?>

단일 포트 출력 예

아래 예제는 UIO0의 0번을 기본 상태가 LOW인 출력포트로 설정하고 HIGH를 출력한 후 입/출력 상태를 읽어서 출력합니다.

<?php
$pid = pid_open("/mmap/uio0");              // 디지털 I/O 열기
pid_ioctl($pid, "set 0 mode out low");      // 0번 포트 출력 설정(LOW)
pid_ioctl($pid, "set 0 output high");       // 0번 포트에 HIGH 출력
$output = pid_ioctl($pid, "get 0 output");  // 0번 포트 출력상태 확인
printf("%d\r\n", $output);                  // 출력 결과: 1
?>

출력 제한 설정 예

아래 예제는 0번 포트에 출력 제한을 설정한 경우와 그렇지 않은 경우에 HIGH 출력의 적용 여부를 비교하는 예제 입니다.

<?php
$pid = pid_open("/mmap/uio0");                // 디지털 I/O 열기
pid_ioctl($pid, "set 0 mode out low");        // 0번 포트 출력 설정(LOW)
pid_ioctl($pid, "set 0 lock");                // 0번 포트 출력 제한 설정
pid_ioctl($pid, "set 0 output high");         // 0번 포트에 HIGH 출력
$output1 = pid_ioctl($pid, "get 0 output");   // 0번 포트 출력상태 확인
pid_ioctl($pid, "set 0 unlock");              // 0번 포트 출력 제한 해제
pid_ioctl($pid, "set 0 output high");         // 0번 포트에 HIGH 출력
$output2 = pid_ioctl($pid, "get 0 output");   // 0번 포트 출력상태 확인
printf("%d, %d\r\n", $output1, $output2);     // 출력 결과: 0, 1
?>