08-09-2018, 06:41 AM 
		
	
	
		Currently the ROCK64 GPIO cannot used in userland. (I currently working on it.)
So I have written a driver for the good old PCF8574 from NXP.
You can find the driver on my Github page:
Additional drivers for OpenBSD
To use the PCF8574, add this to the device trees (Example):
Configuration of the Kernel (add the following):
Compile the kernel.
dmesg output from my driver:
Use the driver with gpioctl:
Turns pin 0 to on.
Use the driver with ioctls (simple running light example):
	
	
	
	
	
So I have written a driver for the good old PCF8574 from NXP.
You can find the driver on my Github page:
Additional drivers for OpenBSD
To use the PCF8574, add this to the device trees (Example):
Code:
/dts-v1/;
/include/ "rk3328-rock64.dts"
&i2c0 {
   status = "okay";
   pcf8574: gpio@20 {
       compatible = "nxp,pcf8574";
       status = "okay";
       reg = <0x20>;
       #gpio-cells = <2>;
       gpio-controller;
   };
};Configuration of the Kernel (add the following):
Code:
pcfgpio*    at iic?
gpio*       at pcfgpio?Compile the kernel.
dmesg output from my driver:
Code:
pcfgpio0 at iic0 addr 0x20
gpio0 at pcfgpio0: 8 pinsUse the driver with gpioctl:
Code:
$ gpioctl /dev/gpio0 0 onUse the driver with ioctls (simple running light example):
Code:
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/gpio.h>
#include <sys/ioctl.h>
int main(int argc, char *argv[])
{
   int i, fd;
   int ret;
   struct gpio_info ginfo;
   struct gpio_pin_op gop;
   
   if (argc < 2) {
       printf("usage: gpio [DEV]\n");
       return 1;
   }
   fd = open(argv[1], O_RDWR);
   if (fd == -1) {
       printf("error: couldn't open file (%s)\n", strerror(errno));
       return 1;
   }
   ret = ioctl(fd, GPIOINFO, &ginfo);
   if (ret == -1) {
       printf("error: ioctl GPIOINFO failed (%s)\n", strerror(errno));
       close(fd);
       return 1;
   }
   printf("gpio: Number of pins: %d\n", ginfo.gpio_npins);
   while (1) {
       for (i = 0; i < ginfo.gpio_npins; i++) {
           gop.gp_pin = i;
           gop.gp_value = GPIO_PIN_HIGH;
           ret = ioctl(fd, GPIOPINWRITE, &gop);
           if (ret == -1) {
               printf("error: ioctl GPIOPINWRITE failed (%s)\n", strerror(errno));
               close(fd);
               return 1;
           }
           sleep(1);
           gop.gp_value = GPIO_PIN_LOW;
           ret = ioctl(fd, GPIOPINWRITE, &gop);
           if (ret == -1) {
               printf("error: ioctl GPIOPINWRITE failed (%s)\n", strerror(errno));
               close(fd);
               return 1;
           }
       }
   }
   close(fd);
   return 0;
}
