/* raspi_gpio_hal.c This could needs to be compiled with -DU8X8_USE_PINS Code partly taken over from http://www.netzmafia.de/skripten/hardware/RasPi/RasPi_GPIO_C.html https://github.com/olikraus/u8g2/wiki/Porting-to-new-MCU-platform#template-for-the-gpio-and-delay-callback */ #include #include #include /* #include #include #include #include */ #include "bcm2835.h" #include "u8x8.h" void delaynanoseconds(unsigned long ns) { struct timespec ts; ts.tv_sec = 0; ts.tv_nsec = ns; nanosleep(&ts, (struct timespec *)NULL); } uint8_t u8x8_gpio_and_delay_raspi_gpio_hal(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr) { int i; //printf("msg %d\n", msg); switch(msg) { case U8X8_MSG_GPIO_I2C_CLOCK: // arg_int=0: Output low at I2C clock pin case U8X8_MSG_GPIO_I2C_DATA: // arg_int=0: Output low at I2C data pin case U8X8_MSG_GPIO_D0: // D0 or SPI clock pin: Output level in arg_int case U8X8_MSG_GPIO_D1: // D1 or SPI data pin: Output level in arg_int case U8X8_MSG_GPIO_D2: // D2 pin: Output level in arg_int case U8X8_MSG_GPIO_D3: // D3 pin: Output level in arg_int case U8X8_MSG_GPIO_D4: // D4 pin: Output level in arg_int case U8X8_MSG_GPIO_D5: // D5 pin: Output level in arg_int case U8X8_MSG_GPIO_D6: // D6 pin: Output level in arg_int case U8X8_MSG_GPIO_D7: // D7 pin: Output level in arg_int case U8X8_MSG_GPIO_E: // E/WR pin: Output level in arg_int case U8X8_MSG_GPIO_CS: // CS (chip select) pin: Output level in arg_int case U8X8_MSG_GPIO_DC: // DC (data/cmd, A0, register select) pin: Output level in arg_int case U8X8_MSG_GPIO_RESET: // Reset pin: Output level in arg_int case U8X8_MSG_GPIO_CS1: // CS1 (chip select) pin: Output level in arg_int case U8X8_MSG_GPIO_CS2: // CS2 (chip select) pin: Output level in arg_int if ( u8x8_GetPinValue(u8x8, msg) != U8X8_PIN_NONE ) { bcm2835_gpio_write(u8x8_GetPinValue(u8x8, msg), arg_int); } break; case U8X8_MSG_GPIO_AND_DELAY_INIT: // called once during init phase of u8g2/u8x8 if (!bcm2835_init()) exit(1); atexit(bcm2835_close); for( i = 0; i < U8X8_PIN_CNT; i++ ) if ( u8x8->pins[i] != U8X8_PIN_NONE ) { if ( i < U8X8_PIN_OUTPUT_CNT ) { bcm2835_gpio_fsel(u8x8->pins[i], BCM2835_GPIO_FSEL_OUTP); } else { // not supported at the moment //gpio_direction(u8x8->pins[i], 0); } } delaynanoseconds(100000); break; // can be used to setup pins case U8X8_MSG_DELAY_NANO: // delay arg_int * 1 nano second delaynanoseconds(arg_int); break; case U8X8_MSG_DELAY_100NANO: // delay arg_int * 100 nano seconds delaynanoseconds((unsigned long)arg_int*100UL); break; case U8X8_MSG_DELAY_10MICRO: // delay arg_int * 10 micro seconds delaynanoseconds((unsigned long)arg_int*10000UL); break; case U8X8_MSG_DELAY_MILLI: // delay arg_int * 1 milli second delaynanoseconds((unsigned long)arg_int*1000000UL); break; case U8X8_MSG_DELAY_I2C: // arg_int is the I2C speed in 100KHz, e.g. 4 = 400 KHz //delaynanoseconds(1250UL*arg_int); delaynanoseconds(1000UL*arg_int); break; // arg_int=1: delay by 5us, arg_int = 4: delay by 1.25us case U8X8_MSG_GPIO_MENU_SELECT: u8x8_SetGPIOResult(u8x8, /* get menu select pin state */ 0); break; case U8X8_MSG_GPIO_MENU_NEXT: u8x8_SetGPIOResult(u8x8, /* get menu next pin state */ 0); break; case U8X8_MSG_GPIO_MENU_PREV: u8x8_SetGPIOResult(u8x8, /* get menu prev pin state */ 0); break; case U8X8_MSG_GPIO_MENU_HOME: u8x8_SetGPIOResult(u8x8, /* get menu home pin state */ 0); break; default: //u8x8_SetGPIOResult(u8x8, 1); // default return value break; } return 1; }