raspi_gpio_hal.c 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. /*
  2. raspi_gpio_hal.c
  3. This could needs to be compiled with -DU8X8_USE_PINS
  4. Code partly taken over from
  5. http://www.netzmafia.de/skripten/hardware/RasPi/RasPi_GPIO_C.html
  6. https://github.com/olikraus/u8g2/wiki/Porting-to-new-MCU-platform#template-for-the-gpio-and-delay-callback
  7. */
  8. #include <sys/stat.h>
  9. #include <sys/types.h>
  10. #include <time.h>
  11. /*
  12. #include <fcntl.h>
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. #include <unistd.h>
  16. */
  17. #include "bcm2835.h"
  18. #include "u8x8.h"
  19. void delaynanoseconds(unsigned long ns)
  20. {
  21. struct timespec ts;
  22. ts.tv_sec = 0;
  23. ts.tv_nsec = ns;
  24. nanosleep(&ts, (struct timespec *)NULL);
  25. }
  26. uint8_t u8x8_gpio_and_delay_raspi_gpio_hal(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
  27. {
  28. int i;
  29. //printf("msg %d\n", msg);
  30. switch(msg)
  31. {
  32. case U8X8_MSG_GPIO_I2C_CLOCK: // arg_int=0: Output low at I2C clock pin
  33. case U8X8_MSG_GPIO_I2C_DATA: // arg_int=0: Output low at I2C data pin
  34. case U8X8_MSG_GPIO_D0: // D0 or SPI clock pin: Output level in arg_int
  35. case U8X8_MSG_GPIO_D1: // D1 or SPI data pin: Output level in arg_int
  36. case U8X8_MSG_GPIO_D2: // D2 pin: Output level in arg_int
  37. case U8X8_MSG_GPIO_D3: // D3 pin: Output level in arg_int
  38. case U8X8_MSG_GPIO_D4: // D4 pin: Output level in arg_int
  39. case U8X8_MSG_GPIO_D5: // D5 pin: Output level in arg_int
  40. case U8X8_MSG_GPIO_D6: // D6 pin: Output level in arg_int
  41. case U8X8_MSG_GPIO_D7: // D7 pin: Output level in arg_int
  42. case U8X8_MSG_GPIO_E: // E/WR pin: Output level in arg_int
  43. case U8X8_MSG_GPIO_CS: // CS (chip select) pin: Output level in arg_int
  44. case U8X8_MSG_GPIO_DC: // DC (data/cmd, A0, register select) pin: Output level in arg_int
  45. case U8X8_MSG_GPIO_RESET: // Reset pin: Output level in arg_int
  46. case U8X8_MSG_GPIO_CS1: // CS1 (chip select) pin: Output level in arg_int
  47. case U8X8_MSG_GPIO_CS2: // CS2 (chip select) pin: Output level in arg_int
  48. if ( u8x8_GetPinValue(u8x8, msg) != U8X8_PIN_NONE )
  49. {
  50. bcm2835_gpio_write(u8x8_GetPinValue(u8x8, msg), arg_int);
  51. }
  52. break;
  53. case U8X8_MSG_GPIO_AND_DELAY_INIT: // called once during init phase of u8g2/u8x8
  54. if (!bcm2835_init())
  55. exit(1);
  56. atexit((void (*) (void))bcm2835_close);
  57. for( i = 0; i < U8X8_PIN_CNT; i++ )
  58. if ( u8x8->pins[i] != U8X8_PIN_NONE )
  59. {
  60. if ( i < U8X8_PIN_OUTPUT_CNT )
  61. {
  62. bcm2835_gpio_fsel(u8x8->pins[i], BCM2835_GPIO_FSEL_OUTP);
  63. }
  64. else
  65. {
  66. // not supported at the moment
  67. //gpio_direction(u8x8->pins[i], 0);
  68. }
  69. }
  70. delaynanoseconds(100000);
  71. break; // can be used to setup pins
  72. case U8X8_MSG_DELAY_NANO: // delay arg_int * 1 nano second
  73. delaynanoseconds(arg_int);
  74. break;
  75. case U8X8_MSG_DELAY_100NANO: // delay arg_int * 100 nano seconds
  76. delaynanoseconds((unsigned long)arg_int*100UL);
  77. break;
  78. case U8X8_MSG_DELAY_10MICRO: // delay arg_int * 10 micro seconds
  79. delaynanoseconds((unsigned long)arg_int*10000UL);
  80. break;
  81. case U8X8_MSG_DELAY_MILLI: // delay arg_int * 1 milli second
  82. delaynanoseconds((unsigned long)arg_int*1000000UL);
  83. break;
  84. case U8X8_MSG_DELAY_I2C: // arg_int is the I2C speed in 100KHz, e.g. 4 = 400 KHz
  85. // correct value would be 10 for 100KHz, but we use 1
  86. // delay seems to be huge by the rest of the system
  87. bcm2835_delayMicroseconds(1);
  88. break; // arg_int=1: delay by 5us, arg_int = 4: delay by 1.25us
  89. case U8X8_MSG_GPIO_MENU_SELECT:
  90. /* read pin level: uint8_t bcm2835_gpio_lev(uint8_t pin); */
  91. u8x8_SetGPIOResult(u8x8, /* get menu select pin state */ 0);
  92. break;
  93. case U8X8_MSG_GPIO_MENU_NEXT:
  94. u8x8_SetGPIOResult(u8x8, /* get menu next pin state */ 0);
  95. break;
  96. case U8X8_MSG_GPIO_MENU_PREV:
  97. u8x8_SetGPIOResult(u8x8, /* get menu prev pin state */ 0);
  98. break;
  99. case U8X8_MSG_GPIO_MENU_HOME:
  100. u8x8_SetGPIOResult(u8x8, /* get menu home pin state */ 0);
  101. break;
  102. default:
  103. //u8x8_SetGPIOResult(u8x8, 1); // default return value
  104. break;
  105. }
  106. return 1;
  107. }