|
@@ -0,0 +1,80 @@
|
|
|
+package GoGPIO_AM335x
|
|
|
+
|
|
|
+import (
|
|
|
+ "syscall"
|
|
|
+)
|
|
|
+
|
|
|
+const (
|
|
|
+ i_IOC_NRBITS = 8
|
|
|
+ i_IOC_TYPEBITS = 8
|
|
|
+ i_IOC_SIZEBITS = 14
|
|
|
+ i_IOC_DIRBITS = 2
|
|
|
+ i_IOC_NRMASK = ((1 << i_IOC_NRBITS)-1)
|
|
|
+ i_IOC_TYPEMASK = ((1 << i_IOC_TYPEBITS)-1)
|
|
|
+ i_IOC_SIZEMASK = ((1 << i_IOC_SIZEBITS)-1)
|
|
|
+ i_IOC_DIRMASK = ((1 << i_IOC_DIRBITS)-1)
|
|
|
+ i_IOC_NRSHIFT = 0
|
|
|
+ i_IOC_TYPESHIFT = (i_IOC_NRSHIFT+i_IOC_NRBITS)
|
|
|
+ i_IOC_SIZESHIFT = (i_IOC_TYPESHIFT+i_IOC_TYPEBITS)
|
|
|
+ i_IOC_DIRSHIFT = (i_IOC_SIZESHIFT+i_IOC_SIZEBITS)
|
|
|
+ i_IOC_NONE = 0
|
|
|
+ i_IOC_WRITE = 1
|
|
|
+ i_IOC_READ = 2
|
|
|
+ i_IOC_IN = (i_IOC_WRITE << i_IOC_DIRSHIFT)
|
|
|
+ i_IOC_OUT = (i_IOC_READ << i_IOC_DIRSHIFT)
|
|
|
+ i_IOC_INOUT = ((i_IOC_WRITE | i_IOC_READ) << i_IOC_DIRSHIFT)
|
|
|
+ i_IOCSIZE_MASK = (i_IOC_SIZEMASK << i_IOC_SIZESHIFT)
|
|
|
+ i_IOCSIZE_SHIFT = i_IOC_SIZESHIFT
|
|
|
+)
|
|
|
+
|
|
|
+func ifn_IOC(Dir uint32, Type uint32, Nr uint32, Size uint32) uint32 {
|
|
|
+ return (((Dir) << i_IOC_DIRSHIFT) | ((Type) << i_IOC_TYPESHIFT) | ((Nr) << i_IOC_NRSHIFT) | ((Size) << i_IOC_SIZESHIFT))
|
|
|
+}
|
|
|
+
|
|
|
+func ifn_IO(Type uint32, Nr uint32) uint32 {
|
|
|
+ return ifn_IOC(i_IOC_NONE,(Type),(Nr),0)
|
|
|
+}
|
|
|
+
|
|
|
+func ifn_IOR(Type uint32, Nr uint32, Size uint32) uint32 {
|
|
|
+ return ifn_IOC(i_IOC_READ,(Type),(Nr),Size)
|
|
|
+}
|
|
|
+
|
|
|
+func ifn_IOW(Type uint32,Nr uint32,Size uint32) uint32 {
|
|
|
+ return ifn_IOC(i_IOC_WRITE,(Type),(Nr),Size)
|
|
|
+}
|
|
|
+
|
|
|
+func ifn_IOWR(Type uint32,Nr uint32,Size uint32) uint32 {
|
|
|
+ return ifn_IOC(i_IOC_READ | i_IOC_WRITE,(Type),(Nr),Size)
|
|
|
+}
|
|
|
+
|
|
|
+func ifn_IOR_BAD(Type uint32, Nr uint32, Size uint32) uint32 {
|
|
|
+ return ifn_IOC(i_IOC_READ,(Type),(Nr),Size)
|
|
|
+}
|
|
|
+
|
|
|
+func ifn_IOW_BAD(Type uint32,Nr uint32,Size uint32) uint32 {
|
|
|
+ return ifn_IOC(i_IOC_WRITE,(Type),(Nr),Size)
|
|
|
+}
|
|
|
+
|
|
|
+func ifn_IOWR_BAD(Type uint32,Nr uint32,Size uint32) uint32 {
|
|
|
+ return ifn_IOC(i_IOC_READ | i_IOC_WRITE,(Type),(Nr),Size)
|
|
|
+}
|
|
|
+
|
|
|
+func ioctl(fd, req, arg uintptr) error {
|
|
|
+ _,_,err :=syscall.Syscall(syscall.SYS_IOCTL,fd,req,arg)
|
|
|
+ if err != 0 {
|
|
|
+ return syscall.Errno(err)
|
|
|
+ }
|
|
|
+ return nil
|
|
|
+}
|
|
|
+
|
|
|
+func sysopen(devpath string) (int,error) {
|
|
|
+ if fd, err := syscall.Open(devpath, syscall.O_RDWR, 0777); err != nil {
|
|
|
+ return fd, err
|
|
|
+ } else {
|
|
|
+ return fd, nil
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func sysclose(fd int) error {
|
|
|
+ return syscall.Close(fd)
|
|
|
+}
|