ioctl.go 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. package GoGPIO_AM335x
  2. import (
  3. "syscall"
  4. )
  5. const (
  6. i_IOC_NRBITS = 8
  7. i_IOC_TYPEBITS = 8
  8. i_IOC_SIZEBITS = 14
  9. i_IOC_DIRBITS = 2
  10. i_IOC_NRMASK = ((1 << i_IOC_NRBITS)-1)
  11. i_IOC_TYPEMASK = ((1 << i_IOC_TYPEBITS)-1)
  12. i_IOC_SIZEMASK = ((1 << i_IOC_SIZEBITS)-1)
  13. i_IOC_DIRMASK = ((1 << i_IOC_DIRBITS)-1)
  14. i_IOC_NRSHIFT = 0
  15. i_IOC_TYPESHIFT = (i_IOC_NRSHIFT+i_IOC_NRBITS)
  16. i_IOC_SIZESHIFT = (i_IOC_TYPESHIFT+i_IOC_TYPEBITS)
  17. i_IOC_DIRSHIFT = (i_IOC_SIZESHIFT+i_IOC_SIZEBITS)
  18. i_IOC_NONE = 0
  19. i_IOC_WRITE = 1
  20. i_IOC_READ = 2
  21. i_IOC_IN = (i_IOC_WRITE << i_IOC_DIRSHIFT)
  22. i_IOC_OUT = (i_IOC_READ << i_IOC_DIRSHIFT)
  23. i_IOC_INOUT = ((i_IOC_WRITE | i_IOC_READ) << i_IOC_DIRSHIFT)
  24. i_IOCSIZE_MASK = (i_IOC_SIZEMASK << i_IOC_SIZESHIFT)
  25. i_IOCSIZE_SHIFT = i_IOC_SIZESHIFT
  26. )
  27. func ifn_IOC(Dir uint32, Type uint32, Nr uint32, Size uint32) uint32 {
  28. return (((Dir) << i_IOC_DIRSHIFT) | ((Type) << i_IOC_TYPESHIFT) | ((Nr) << i_IOC_NRSHIFT) | ((Size) << i_IOC_SIZESHIFT))
  29. }
  30. func ifn_IO(Type uint32, Nr uint32) uint32 {
  31. return ifn_IOC(i_IOC_NONE,(Type),(Nr),0)
  32. }
  33. func ifn_IOR(Type uint32, Nr uint32, Size uint32) uint32 {
  34. return ifn_IOC(i_IOC_READ,(Type),(Nr),Size)
  35. }
  36. func ifn_IOW(Type uint32,Nr uint32,Size uint32) uint32 {
  37. return ifn_IOC(i_IOC_WRITE,(Type),(Nr),Size)
  38. }
  39. func ifn_IOWR(Type uint32,Nr uint32,Size uint32) uint32 {
  40. return ifn_IOC(i_IOC_READ | i_IOC_WRITE,(Type),(Nr),Size)
  41. }
  42. func ifn_IOR_BAD(Type uint32, Nr uint32, Size uint32) uint32 {
  43. return ifn_IOC(i_IOC_READ,(Type),(Nr),Size)
  44. }
  45. func ifn_IOW_BAD(Type uint32,Nr uint32,Size uint32) uint32 {
  46. return ifn_IOC(i_IOC_WRITE,(Type),(Nr),Size)
  47. }
  48. func ifn_IOWR_BAD(Type uint32,Nr uint32,Size uint32) uint32 {
  49. return ifn_IOC(i_IOC_READ | i_IOC_WRITE,(Type),(Nr),Size)
  50. }
  51. func ioctl(fd, req, arg uintptr) error {
  52. _,_,err :=syscall.Syscall(syscall.SYS_IOCTL,fd,req,arg)
  53. if err != 0 {
  54. return syscall.Errno(err)
  55. }
  56. return nil
  57. }
  58. func sysopen(devpath string) (int,error) {
  59. if fd, err := syscall.Open(devpath, syscall.O_RDWR, 0777); err != nil {
  60. return fd, err
  61. } else {
  62. return fd, nil
  63. }
  64. }
  65. func sysclose(fd int) error {
  66. return syscall.Close(fd)
  67. }