GPIO.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. package GoGPIO_AM335x
  2. import (
  3. "unsafe"
  4. "errors"
  5. )
  6. type GPIO_PIN_MODE int
  7. const(
  8. GPIO_DefaultDeviceFile = "/dev/am335x_gpio"
  9. i_GPIO_IOC_MAGIC = 'G'
  10. i_SizeOfInt = 4
  11. GPIO_PINMODE_INPUT GPIO_PIN_MODE = 0
  12. GPIO_PINMODE_OUTPUT GPIO_PIN_MODE = 1
  13. )
  14. type GPIO_Struct struct {
  15. Pin int
  16. Value int
  17. }
  18. type GPIO_Pin struct {
  19. GPIO_OpStr GPIO_Struct
  20. Mode GPIO_PIN_MODE
  21. }
  22. type GPIO_Device struct {
  23. fd int
  24. }
  25. func NewGPIO_Device(devpath string) (*GPIO_Device,error) {
  26. gdev := GPIO_Device{}
  27. fd,err := sysopen(devpath)
  28. if err != nil{
  29. return nil,err
  30. }
  31. gdev.fd = fd
  32. return &gdev,nil
  33. }
  34. func (this *GPIO_Device)Close() error {
  35. return sysclose(this.fd)
  36. }
  37. func (this *GPIO_Device)InitPin(Pin *GPIO_Pin) error {
  38. switch Pin.Mode {
  39. case GPIO_PINMODE_INPUT:
  40. err := ioctl(uintptr(this.fd),uintptr(ifn_IOCTL_GPIO_SETINPUT()),uintptr(unsafe.Pointer(&Pin.GPIO_OpStr)))
  41. if err != nil{
  42. return err
  43. }
  44. return nil
  45. break
  46. case GPIO_PINMODE_OUTPUT:
  47. err := ioctl(uintptr(this.fd),uintptr(ifn_IOCTL_GPIO_SETOUTPUT()),uintptr(unsafe.Pointer(&Pin.GPIO_OpStr)))
  48. if err != nil{
  49. return err
  50. }
  51. return nil
  52. break
  53. default:
  54. return errors.New("Unknown Pin Mode.")
  55. }
  56. return errors.New("Unknown Error.")
  57. }
  58. func (this *GPIO_Device)GetPin(Pin *GPIO_Pin) (bool,error) {
  59. err := this.ReadPin(Pin)
  60. if err != nil{
  61. return false,err
  62. }
  63. if(Pin.GPIO_OpStr.Value == 0){
  64. return false,nil
  65. }else {
  66. return true,nil
  67. }
  68. }
  69. func (this *GPIO_Device)SetPin(Pin *GPIO_Pin, Val bool) error {
  70. Pin.GPIO_OpStr.Value = iuf_Bool2Int(Val)
  71. return this.WritePin(Pin)
  72. }
  73. func (this *GPIO_Device)ReadPin(Pin *GPIO_Pin) error {
  74. err := ioctl(uintptr(this.fd),uintptr(ifn_IOCTL_GPIO_GETVALUE()),uintptr(unsafe.Pointer(&Pin.GPIO_OpStr)))
  75. if err != nil{
  76. return err
  77. }
  78. return nil
  79. //TODO: Still Have Bugs Here.
  80. }
  81. func (this *GPIO_Device)WritePin(Pin *GPIO_Pin) error {
  82. err := ioctl(uintptr(this.fd),uintptr(ifn_IOCTL_GPIO_SETVALUE()),uintptr(unsafe.Pointer(&Pin.GPIO_OpStr)))
  83. if err != nil{
  84. return err
  85. }
  86. return nil
  87. }
  88. func NewGPIO_Pin(BankNum int,PinNum int, PinMode GPIO_PIN_MODE, DefaultLevel bool) *GPIO_Pin {
  89. gpin := GPIO_Pin{
  90. GPIO_OpStr:GPIO_Struct{
  91. Pin:ifn_GPIO_TO_PIN(BankNum,PinNum),
  92. Value:iuf_Bool2Int(DefaultLevel),
  93. },
  94. Mode:PinMode,
  95. }
  96. return &gpin
  97. }
  98. func ifn_GPIO_TO_PIN(BankNum int,PinNum int) int{
  99. return 32 * (BankNum) + (PinNum)
  100. }
  101. func ifn_IOCTL_GPIO_SETOUTPUT() uint32 {
  102. return ifn_IOW(i_GPIO_IOC_MAGIC, 0,i_SizeOfInt )
  103. }
  104. func ifn_IOCTL_GPIO_SETINPUT() uint32 {
  105. return ifn_IOW(i_GPIO_IOC_MAGIC, 1,i_SizeOfInt )
  106. }
  107. func ifn_IOCTL_GPIO_SETVALUE() uint32 {
  108. return ifn_IOW(i_GPIO_IOC_MAGIC, 2,i_SizeOfInt )
  109. }
  110. func ifn_IOCTL_GPIO_GETVALUE() uint32 {
  111. return ifn_IOW(i_GPIO_IOC_MAGIC, 3,i_SizeOfInt )
  112. }
  113. func iuf_Bool2Int(B bool) int {
  114. if(B){
  115. return 1
  116. }else {
  117. return 0
  118. }
  119. }