コード例 #1
0
uint8_t u8g_com_raspberrypi_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr)
{
  switch(msg)
  {
    case U8G_COM_MSG_STOP:
      break;
    
    case U8G_COM_MSG_INIT:
		// check wiringPi setup
		if (wiringPiSetup() == -1)
		{
			printf("wiringPi-Error\n");
			exit(1);
		}

		if (wiringPiSPISetup (0, 100000) < 0)
		{
			printf ("Unable to open SPI device 0: %s\n", strerror (errno)) ;
			exit (1) ;
		}
		
		u8g_SetPIOutput(u8g, U8G_PI_RESET);
		u8g_SetPIOutput(u8g, U8G_PI_A0);

      break;
    
    case U8G_COM_MSG_ADDRESS:                     /* define cmd (arg_val = 0) or data mode (arg_val = 1) */
	  u8g_SetPILevel(u8g, U8G_PI_A0, arg_val);
      break;

    case U8G_COM_MSG_CHIP_SELECT:
		/* Done by the SPI hardware */
      break;
      
    case U8G_COM_MSG_RESET:
      u8g_SetPILevel(u8g, U8G_PI_RESET, arg_val);
      break;
    
    case U8G_COM_MSG_WRITE_BYTE:
		wiringPiSPIDataRW (0, &arg_val, 1) ;
      break;
    
    case U8G_COM_MSG_WRITE_SEQ:
		wiringPiSPIDataRW (0, arg_ptr, arg_val);
      break;

	case U8G_COM_MSG_WRITE_SEQ_P:
		wiringPiSPIDataRW (0, arg_ptr, arg_val);		
      break;
  }
  return 1;
}
コード例 #2
0
uint8_t u8g_com_stm32duino_fsmc_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) {
  if (msgInitCount) {
    if (msg == U8G_COM_MSG_INIT) msgInitCount--;
    if (msgInitCount) return -1;
  }

  static uint8_t isCommand;

  switch (msg) {
    case U8G_COM_MSG_STOP:
      break;
    case U8G_COM_MSG_INIT:
      u8g_SetPIOutput(u8g, U8G_PI_RESET);

      LCD_IO_Init(u8g->pin_list[U8G_PI_CS], u8g->pin_list[U8G_PI_A0]);
      u8g_Delay(100);

      if (arg_ptr != NULL)
        *((uint32_t *)arg_ptr) = LCD_IO_ReadData(LCD_READ_ID, 3);

      isCommand = 0;
      break;

    case U8G_COM_MSG_ADDRESS:           // define cmd (arg_val = 0) or data mode (arg_val = 1)
      isCommand = arg_val == 0 ? 1 : 0;
      break;

    case U8G_COM_MSG_RESET:
      u8g_SetPILevel(u8g, U8G_PI_RESET, arg_val);
      break;

    case U8G_COM_MSG_WRITE_BYTE:
      if (isCommand)
        LCD_IO_WriteReg(arg_val);
      else
        LCD_IO_WriteData((uint16_t)arg_val);
      break;

    case U8G_COM_MSG_WRITE_SEQ:

      for (uint8_t i = 0; i < arg_val; i += 2)
        LCD_IO_WriteData(*(uint16_t *)(((uint32_t)arg_ptr) + i));
      break;
  }
  return 1;
}
コード例 #3
0
uint8_t u8g_com_atmega_st7920_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr)
{
  switch(msg)
  {
    case U8G_COM_MSG_INIT:
      u8g_SetPIOutput(u8g, U8G_PI_CS);
      //u8g_SetPIOutput(u8g, U8G_PI_A0);
      
      U8G_ATOMIC_START();

      DDRB |= U8G_ATMEGA_HW_SPI_MOSI_PIN;
      DDRB |= U8G_ATMEGA_HW_SPI_SCK_PIN;
      DDRB |= U8G_ATMEGA_HW_SPI_SLAVE_SELECT_PIN;

      PORTB &= ~U8G_ATMEGA_HW_SPI_MOSI_PIN;
      PORTB &= ~U8G_ATMEGA_HW_SPI_SCK_PIN;
      U8G_ATOMIC_END();
      
      u8g_SetPILevel(u8g, U8G_PI_CS, 1);

      /*
        SPR1 SPR0
            0	0		fclk/4
            0	1		fclk/16 
            1	0		fclk/64  
            1	1		fclk/128
      */
      SPCR = 0;
      
      /* maybe set CPOL and CPHA to 1 */
      /* 20 Dez 2012: did set CPOL and CPHA to 1 in Arduino variant! */
      /* 24 Jan 2014: implemented, see also issue 221 */
      SPCR =  (1<<SPE) | (1<<MSTR)|(0<<SPR1)|(0<<SPR0)|(1<<CPOL)|(1<<CPHA);
#ifdef U8G_HW_SPI_2X
      SPSR = (1 << SPI2X);  /* double speed, issue 89 */
#endif
      u8g->pin_list[U8G_PI_A0_STATE] = 0;       /* inital RS state: command mode */
      break;
    
    case U8G_COM_MSG_STOP:
      break;

    case U8G_COM_MSG_RESET:
      u8g_SetPILevel(u8g, U8G_PI_RESET, arg_val);
      break;
    
    case U8G_COM_MSG_ADDRESS:                     /* define cmd (arg_val = 0) or data mode (arg_val = 1) */
      u8g->pin_list[U8G_PI_A0_STATE] = arg_val;
      break;

    case U8G_COM_MSG_CHIP_SELECT:      
      if ( arg_val == 0 )
      {
        /* disable, note: the st7920 has an active high chip select */
        u8g_SetPILevel(u8g, U8G_PI_CS, 0);
      }
      else
      {
        /* u8g_SetPILevel(u8g, U8G_PI_SCK, 0 ); */
        /* enable */
        u8g_SetPILevel(u8g, U8G_PI_CS, 1); /* CS = 1 (high active) */
      }
      break;
      

    case U8G_COM_MSG_WRITE_BYTE:
      u8g_com_atmega_st7920_write_byte_hw_spi(u8g, u8g->pin_list[U8G_PI_A0_STATE], arg_val);
      //u8g->pin_list[U8G_PI_A0_STATE] = 2; 
      break;
    
    case U8G_COM_MSG_WRITE_SEQ:
      {
        register uint8_t *ptr = arg_ptr;
        while( arg_val > 0 )
        {
          u8g_com_atmega_st7920_write_byte_hw_spi(u8g, u8g->pin_list[U8G_PI_A0_STATE], *ptr++);
	  //u8g->pin_list[U8G_PI_A0_STATE] = 2; 
          arg_val--;
        }
      }
      break;

      case U8G_COM_MSG_WRITE_SEQ_P:
      {
        register uint8_t *ptr = arg_ptr;
        while( arg_val > 0 )
        {
          u8g_com_atmega_st7920_write_byte_hw_spi(u8g, u8g->pin_list[U8G_PI_A0_STATE], u8g_pgm_read(ptr));
	  //u8g->pin_list[U8G_PI_A0_STATE] = 2; 
          ptr++;
          arg_val--;
        }
      }
      break;
  }
  return 1;
}
uint8_t u8g_com_atxmega_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr)
{
  switch(msg)
  {
    case U8G_COM_MSG_STOP:
    break;
    
    case U8G_COM_MSG_INIT:

    u8g_SetPIOutput(u8g, U8G_PI_CS);
    u8g_SetPIOutput(u8g, U8G_PI_A0);
    u8g_SetPIOutput(u8g, U8G_PI_RESET);
    
    //U8G_ATOMIC_START();
    
    PORTC.DIR |= PIN4_bm | PIN5_bm | PIN7_bm;
    PORTC.DIR &= ~PIN6_bm;

    //U8G_ATOMIC_END();
    
    u8g_SetPILevel(u8g, U8G_PI_CS, 1);

    SPIC.CTRL = 0;
    SPIC.CTRL     = SPI_PRESCALER_DIV4_gc |		// SPI prescaler.
    //SPI_CLK2X_bm |			 //SPI Clock double.
    SPI_ENABLE_bm |			 //Enable SPI module.
    //SPI_DORD_bm |			 //Data order.
    SPI_MASTER_bm |			 //SPI master.
    SPI_MODE_0_gc;			// SPI mode.
    
#ifdef U8G_HW_SPI_2X
    SPIC.CTRL |= SPI_CLK2X_bm;  /* double speed, issue 89 */
#endif

    break;
    
    case U8G_COM_MSG_ADDRESS:                     /* define cmd (arg_val = 0) or data mode (arg_val = 1) */
    u8g_SetPILevel(u8g, U8G_PI_A0, arg_val);
    break;

    case U8G_COM_MSG_CHIP_SELECT:
    
    if ( arg_val == 0 )
    {
      /* disable */
      u8g_SetPILevel(u8g, U8G_PI_CS, 1);
    }
    else
    {
      //PORTB &= ~_BV(5);        /* SCK = 0 */
      PORTC.OUT &= ~PIN7_bm;
      /* enable */
      u8g_SetPILevel(u8g, U8G_PI_CS, 0); /* CS = 0 (low active) */
    }
    
    break;
    
    case U8G_COM_MSG_RESET:
    u8g_SetPILevel(u8g, U8G_PI_RESET, arg_val);
    break;
    
    case U8G_COM_MSG_WRITE_BYTE:
    u8g_atxmega_spi_out(arg_val);
    break;
    
    case U8G_COM_MSG_WRITE_SEQ:
    {
      register uint8_t *ptr = arg_ptr;
      while( arg_val > 0 )
      {
        u8g_atxmega_spi_out(*ptr++);
        arg_val--;
      }
    }
    break;
    case U8G_COM_MSG_WRITE_SEQ_P:
    {
      register uint8_t *ptr = arg_ptr;
      while( arg_val > 0 )
      {
        u8g_atxmega_spi_out(u8g_pgm_read(ptr));
        ptr++;
        arg_val--;
      }
    }
    break;
  }
  return 1;
}
コード例 #5
0
uint8_t u8g_com_atmega_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr)
{
  switch(msg)
  {
    case U8G_COM_MSG_STOP:
      break;
    
    case U8G_COM_MSG_INIT:

      u8g_SetPIOutput(u8g, U8G_PI_CS);
      u8g_SetPIOutput(u8g, U8G_PI_A0);
      
      DDRB |= _BV(3);          /* D0, MOSI */
      DDRB |= _BV(5);          /* SCK */
    
      PORTB &= ~_BV(3);        /* D0, MOSI = 0 */
      PORTB &= ~_BV(5);        /* SCK = 0 */
      u8g_SetPILevel(u8g, U8G_PI_CS, 1);

      /*
        SPR1 SPR0
            0	0		fclk/4
            0	1		fclk/16
            1	0		fclk/64
            1	1		fclk/128
      */
      SPCR = 0;
      SPCR =  (1<<SPE) | (1<<MSTR)|(0<<SPR1)|(0<<SPR0)|(0<<CPOL)|(0<<CPHA);
      
      break;
    
    case U8G_COM_MSG_ADDRESS:                     /* define cmd (arg_val = 0) or data mode (arg_val = 1) */
      u8g_SetPILevel(u8g, U8G_PI_A0, arg_val);
      break;

    case U8G_COM_MSG_CHIP_SELECT:
      
      if ( arg_val == 0 )
      {
        /* disable */
        u8g_SetPILevel(u8g, U8G_PI_CS, 1);
      }
      else
      {
        PORTB &= ~_BV(5);        /* SCK = 0 */
        /* enable */
        u8g_SetPILevel(u8g, U8G_PI_CS, 0); /* CS = 0 (low active) */
      }
      
      break;
      
    case U8G_COM_MSG_RESET:
      u8g_SetPILevel(u8g, U8G_PI_RESET, arg_val);
      break;
    
    case U8G_COM_MSG_WRITE_BYTE:
      u8g_atmega_spi_out(arg_val);
      break;
    
    case U8G_COM_MSG_WRITE_SEQ:
      {
        register uint8_t *ptr = arg_ptr;
        while( arg_val > 0 )
        {
          u8g_atmega_spi_out(*ptr++);
          arg_val--;
        }
      }
      break;
    case U8G_COM_MSG_WRITE_SEQ_P:
      {
        register uint8_t *ptr = arg_ptr;
        while( arg_val > 0 )
        {
          u8g_atmega_spi_out(u8g_pgm_read(ptr));
          ptr++;
          arg_val--;
        }
      }
      break;
  }
  return 1;
}
コード例 #6
0
uint8_t u8g_com_atxmega_st7920_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr)
{
    switch(msg)
    {
    case U8G_COM_MSG_INIT:
        u8g_SetPIOutput(u8g, U8G_PI_CS);
        //u8g_SetPIOutput(u8g, U8G_PI_A0);

        //U8G_ATOMIC_START();

        PORTC.DIR |= PIN4_bm | PIN5_bm | PIN7_bm;
        PORTC.DIR &= ~PIN6_bm;

        //U8G_ATOMIC_END();

        u8g_SetPILevel(u8g, U8G_PI_CS, 1);

        SPIC.CTRL = 0;
        SPIC.CTRL     = SPI_PRESCALER_DIV4_gc |		// SPI prescaler.
                        //SPI_CLK2X_bm |			 //SPI Clock double.
                        SPI_ENABLE_bm |			 //Enable SPI module.
                        //SPI_DORD_bm |			 //Data order.
                        SPI_MASTER_bm |			 //SPI master.
                        SPI_MODE_0_gc;			// SPI mode.

#ifdef U8G_HW_SPI_2X
        SPIC.CTRL |= SPI_CLK2X_bm;  /* double speed, issue 89 */
#endif

        u8g->pin_list[U8G_PI_A0_STATE] = 0;       /* inital RS state: command mode */
        break;

    case U8G_COM_MSG_STOP:
        break;

    case U8G_COM_MSG_RESET:
        u8g_SetPILevel(u8g, U8G_PI_RESET, arg_val);
        break;

    case U8G_COM_MSG_ADDRESS:                     /* define cmd (arg_val = 0) or data mode (arg_val = 1) */
        u8g->pin_list[U8G_PI_A0_STATE] = arg_val;
        break;

    case U8G_COM_MSG_CHIP_SELECT:
        if ( arg_val == 0 )
        {
            /* disable, note: the st7920 has an active high chip select */
            u8g_SetPILevel(u8g, U8G_PI_CS, 0);
        }
        else
        {
            /* u8g_SetPILevel(u8g, U8G_PI_SCK, 0 ); */
            /* enable */
            u8g_SetPILevel(u8g, U8G_PI_CS, 1); /* CS = 1 (high active) */
        }
        break;


    case U8G_COM_MSG_WRITE_BYTE:
        u8g_com_atxmega_st7920_write_byte_hw_spi(u8g, u8g->pin_list[U8G_PI_A0_STATE], arg_val);
        //u8g->pin_list[U8G_PI_A0_STATE] = 2;
        break;

    case U8G_COM_MSG_WRITE_SEQ:
    {
        register uint8_t *ptr = arg_ptr;
        while( arg_val > 0 )
        {
            u8g_com_atxmega_st7920_write_byte_hw_spi(u8g, u8g->pin_list[U8G_PI_A0_STATE], *ptr++);
            //u8g->pin_list[U8G_PI_A0_STATE] = 2;
            arg_val--;
        }
    }
    break;

    case U8G_COM_MSG_WRITE_SEQ_P:
    {
        register uint8_t *ptr = arg_ptr;
        while( arg_val > 0 )
        {
            u8g_com_atxmega_st7920_write_byte_hw_spi(u8g, u8g->pin_list[U8G_PI_A0_STATE], u8g_pgm_read(ptr));
            //u8g->pin_list[U8G_PI_A0_STATE] = 2;
            ptr++;
            arg_val--;
        }
    }
    break;
    }
    return 1;
}
コード例 #7
0
uint8_t u8g_com_atmega_parallel_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr)
{
  switch(msg)
  {
    case U8G_COM_MSG_INIT:
      /* setup the RW pin as output and force it to low */
      u8g_SetPIOutput(u8g, U8G_PI_RW);
      u8g_SetPILevel(u8g, U8G_PI_RW, 0);

      u8g_SetPIOutput(u8g, U8G_PI_D0);
      u8g_SetPIOutput(u8g, U8G_PI_D1);
      u8g_SetPIOutput(u8g, U8G_PI_D2);
      u8g_SetPIOutput(u8g, U8G_PI_D3);
      u8g_SetPIOutput(u8g, U8G_PI_D4);
      u8g_SetPIOutput(u8g, U8G_PI_D5);
      u8g_SetPIOutput(u8g, U8G_PI_D6);
      u8g_SetPIOutput(u8g, U8G_PI_D7);
      u8g_SetPIOutput(u8g, U8G_PI_EN);
      u8g_SetPIOutput(u8g, U8G_PI_CS1);
      u8g_SetPIOutput(u8g, U8G_PI_CS2);
      u8g_SetPIOutput(u8g, U8G_PI_DI);
      u8g_SetPILevel(u8g, U8G_PI_CS1, 1);
      u8g_SetPILevel(u8g, U8G_PI_CS2, 1);

      break;
    case U8G_COM_MSG_STOP:
      break;
    case U8G_COM_MSG_CHIP_SELECT:
      if ( arg_val == 0 )
      {
        /* disable */
        u8g_SetPILevel(u8g, U8G_PI_CS1, 1);
        u8g_SetPILevel(u8g, U8G_PI_CS2, 1);
      }
      else if ( arg_val == 1 )
      {
        /* enable */
        u8g_SetPILevel(u8g, U8G_PI_CS1, 0);
        u8g_SetPILevel(u8g, U8G_PI_CS2, 1);
      }
      else if ( arg_val == 2 )
      {
        /* enable */
        u8g_SetPILevel(u8g, U8G_PI_CS1, 1);
        u8g_SetPILevel(u8g, U8G_PI_CS2, 0);
      }
      else
      {
        /* enable */
        u8g_SetPILevel(u8g, U8G_PI_CS1, 0);
        u8g_SetPILevel(u8g, U8G_PI_CS2, 0);
      }
      break;
    case U8G_COM_MSG_WRITE_BYTE:
      u8g_com_atmega_parallel_write(u8g, arg_val);
      break;
    case U8G_COM_MSG_WRITE_SEQ:
      {
        register uint8_t *ptr = arg_ptr;
        while( arg_val > 0 )
        {
          u8g_com_atmega_parallel_write(u8g, *ptr++);
          arg_val--;
        }
      }
      break;
    case U8G_COM_MSG_WRITE_SEQ_P:
      {
        register uint8_t *ptr = arg_ptr;
        while( arg_val > 0 )
        {
          u8g_com_atmega_parallel_write(u8g, u8g_pgm_read(ptr));
          ptr++;
          arg_val--;
        }
      }
      break;
    case U8G_COM_MSG_ADDRESS:                     /* define cmd (arg_val = 0) or data mode (arg_val = 1) */
      u8g_SetPILevel(u8g, U8G_PI_DI, arg_val);
      break;
  }
  return 1;
}