디지털 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에 값을 출력하기 위해서는 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
?>