/** * @ingroup I2C * Prints the identification string. * @param device_info */ void bw_i2c_read_id(const device_info_t *device_info) { char cmd[] = { BW_PORT_READ_ID_STRING }; char buf[BW_ID_STRING_LENGTH]; FUNC_PREFIX(i2c_setSlaveAddress(device_info->slave_address >> 1)); #ifdef __AVR_ARCH__ #else bcm2835_i2c_setClockDivider(BCM2835_I2C_CLOCK_DIVIDER_2500); #endif FUNC_PREFIX(i2c_write(cmd, sizeof(cmd) / sizeof(char))); FUNC_PREFIX(i2c_read(buf, BW_ID_STRING_LENGTH)); printf("[%s]\n", buf); }
void inline static mcp7941x_setup(void) { FUNC_PREFIX(i2c_setSlaveAddress(i2c_mcp7941x_slave_address)); #ifdef __AVR_ARCH__ #else bcm2835_i2c_setClockDivider(BCM2835_I2C_CLOCK_DIVIDER_2500); #endif }
/** * @ingroup I2C-RTC * * @param t */ void mcp7941x_set_date_time(const struct rtc_time *t) { char reg[] = {0,0,0,0,0,0,0}; reg[MCP7941X_RTCC_TCR_SECONDS] = DEC2BCD(t->tm_sec & 0x7f); reg[MCP7941X_RTCC_TCR_MINUTES] = DEC2BCD(t->tm_min & 0x7f); reg[MCP7941X_RTCC_TCR_HOURS] = DEC2BCD(t->tm_hour & 0x1f); reg[MCP7941X_RTCC_TCR_DAY] = DEC2BCD(t->tm_wday & 0x07); reg[MCP7941X_RTCC_TCR_DATE] = DEC2BCD(t->tm_mday & 0x3f); reg[MCP7941X_RTCC_TCR_MONTH] = DEC2BCD(t->tm_mon & 0x1f); reg[MCP7941X_RTCC_TCR_YEAR] = DEC2BCD(t->tm_year); reg[MCP7941X_RTCC_TCR_SECONDS] |= MCP7941X_RTCC_BIT_ST; reg[MCP7941X_RTCC_TCR_DAY] |= MCP7941X_RTCC_BIT_VBATEN; char data[8]; data[0] = MCP7941X_RTCC_TCR_SECONDS; data[1] = reg[0]; data[2] = reg[1]; data[3] = reg[2]; data[4] = reg[3]; data[5] = reg[4]; data[6] = reg[5]; data[7] = reg[6]; mcp7941x_setup(); FUNC_PREFIX(i2c_write(data, sizeof(data)/sizeof(char))); }
/** * @ingroup SPI-LCD * * @param device_info */ void bw_spi_lcd_cls(const device_info_t *device_info) { char cmd[] = { (char) 0x00, (char) BW_PORT_WRITE_CLEAR_SCREEN, (char) ' ' }; cmd[0] = (char) device_info->slave_address; lcd_spi_setup(device_info); FUNC_PREFIX(spi_writenb(cmd, sizeof(cmd) / sizeof(cmd[0]))); udelay(BW_LCD_SPI_BYTE_WAIT_US); }
/** * @ingroup I2C-RTC * * @param t */ void mcp7941x_get_date_time(struct rtc_time *t) { char cmd[] = {MCP7941X_RTCC_TCR_SECONDS}; char reg[] = {0,0,0,0,0,0,0}; mcp7941x_setup(); FUNC_PREFIX(i2c_write(cmd, sizeof(cmd)/sizeof(char))); FUNC_PREFIX(i2c_read(reg, sizeof(reg)/sizeof(char))); t->tm_sec = BCD2DEC(reg[MCP7941X_RTCC_TCR_SECONDS] & 0x7f); t->tm_min = BCD2DEC(reg[MCP7941X_RTCC_TCR_MINUTES] & 0x7f); t->tm_hour = BCD2DEC(reg[MCP7941X_RTCC_TCR_HOURS] & 0x3f); t->tm_wday = BCD2DEC(reg[MCP7941X_RTCC_TCR_DAY] & 0x07); t->tm_mday = BCD2DEC(reg[MCP7941X_RTCC_TCR_DATE] & 0x3f); t->tm_mon = BCD2DEC(reg[MCP7941X_RTCC_TCR_MONTH] & 0x1f); t->tm_year = BCD2DEC(reg[MCP7941X_RTCC_TCR_YEAR]); }
/** * @ingroup SPI-DO * * @param device_info * @param mask */ inline static void bw_spi_relay_fsel_mask(const device_info_t *device_info, const uint8_t mask) { char cmd[3]; cmd[0] = device_info->slave_address; cmd[1] = BW_PORT_WRITE_IO_DIRECTION; cmd[2] = mask; relay_spi_setup(device_info); FUNC_PREFIX(spi_writenb(cmd, sizeof(cmd) / sizeof(char))); udelay(BW_RELAY_SPI_BYTE_WAIT_US); }
/** * @ingroup SPI-DO * * @param device_info * @param pins */ void bw_spi_relay_output(const device_info_t *device_info, const uint8_t pins) { char cmd[3]; cmd[0] = device_info->slave_address; cmd[1] = BW_PORT_WRITE_SET_ALL_OUTPUTS; cmd[2] = pins; relay_spi_setup(device_info); FUNC_PREFIX(spi_writenb(cmd, sizeof(cmd) / sizeof(char))); udelay(BW_RELAY_SPI_BYTE_WAIT_US); }
/** * @ingroup SPI-LCD * * @param device_info * @param line * @param pos */ void bw_spi_lcd_set_cursor(const device_info_t *device_info, const uint8_t line, const uint8_t pos) { char cmd[] = { (char) 0x00, (char) BW_PORT_WRITE_MOVE_CURSOR, (char) 0x00 }; cmd[0] = (char) device_info->slave_address; cmd[2] = (char) (((line & 0x03) << 5) | (pos & 0x1f)); lcd_spi_setup(device_info); FUNC_PREFIX(spi_writenb(cmd, sizeof(cmd) / sizeof(cmd[0]))); udelay(BW_LCD_SPI_BYTE_WAIT_US); }
/** * @ingroup SPI-LCD * * @param device_info * @param value */ void bw_spi_lcd_get_contrast(const device_info_t *device_info, uint8_t *value) { char cmd[] = { (char) 0x00, (char) BW_PORT_READ_CURRENT_CONTRAST, (char) 0x00 }; cmd[0] = (char) (device_info->slave_address | 1); lcd_spi_setup(device_info); FUNC_PREFIX(spi_transfern(cmd, sizeof(cmd) / sizeof(char))); udelay(BW_LCD_SPI_BYTE_WAIT_US); *value = (uint8_t)cmd[2]; }
/** * @ingroup SPI-LCD * * @param device_info * @param value */ void bw_spi_lcd_set_backlight(const device_info_t *device_info, const uint8_t value) { char cmd[] = { (char) 0x00, (char) BW_PORT_WRITE_SET_BACKLIGHT, (char) 0x00 }; cmd[0] = (char) device_info->slave_address; cmd[2] = (char) value; lcd_spi_setup(device_info); FUNC_PREFIX(spi_writenb(cmd, sizeof(cmd) / sizeof(cmd[0]))); udelay(BW_LCD_SPI_BYTE_WAIT_US); }
/** * @ingroup SPI-DIO * * @param device_info * @return */ uint8_t bw_spi_dio_start(device_info_t *device_info) { #if !defined(BARE_METAL) && !defined(__AVR_ARCH__) if (bcm2835_init() != 1) return 1; #endif FUNC_PREFIX(spi_begin()); if (device_info->slave_address <= 0) device_info->slave_address = BW_DIO_DEFAULT_SLAVE_ADDRESS; return 0; }
/** * @ingroup SPI-LCD * * @param device_info * @param text * @param length */ void bw_spi_lcd_text(const device_info_t *device_info, const char *text, uint8_t length) { char data[BW_LCD_MAX_CHARACTERS + 2]; uint8_t i; data[0] = (char) device_info->slave_address; data[1] = (char) BW_PORT_WRITE_DISPLAY_DATA; if (length > BW_LCD_MAX_CHARACTERS) length = BW_LCD_MAX_CHARACTERS; for (i = 0; i < length; i++) data[i + 2] = text[i]; lcd_spi_setup(device_info); FUNC_PREFIX(spi_writenb(data, length + 2)); udelay(BW_LCD_SPI_BYTE_WAIT_US); }
/** * @ingroup I2C-RTC * * @param slave_address * @return */ uint8_t mcp7941x_start (const uint8_t slave_address) { #if !defined(BARE_METAL) && !defined(__AVR_ARCH__) if (bcm2835_init() != 1) return MCP7941X_ERROR; #endif FUNC_PREFIX(i2c_begin()); if (slave_address <= 0) i2c_mcp7941x_slave_address = MCP7941X_DEFAULT_SLAVE_ADDRESS; else i2c_mcp7941x_slave_address = slave_address; mcp7941x_setup(); if (bcm2835_i2c_write(NULL, 0) == 0) return MCP7941X_OK; return MCP7941X_ERROR; }
/** * @ingroup SPI-LCD * * @param device_info * @return */ uint8_t bw_spi_lcd_start(device_info_t *device_info) { #if !defined(BARE_METAL) && !defined(__AVR_ARCH__) if (bcm2835_init() != 1) return BW_LCD_ERROR; #endif FUNC_PREFIX(spi_begin()); if (device_info->slave_address == (uint8_t) 0) { device_info->slave_address = BW_LCD_DEFAULT_SLAVE_ADDRESS; } if (device_info->speed_hz == (uint32_t) 0) { device_info->speed_hz = (uint32_t) BW_LCD_SPI_SPEED_DEFAULT_HZ; } else if (device_info->speed_hz > (uint32_t) BW_LCD_SPI_SPEED_MAX_HZ) { device_info->speed_hz = (uint32_t) BW_LCD_SPI_SPEED_MAX_HZ; } #ifdef __AVR_ARCH__ #else device_info->internal_clk_div = (uint16_t)((uint32_t) BCM2835_CORE_CLK_HZ / device_info->speed_hz); #endif return BW_LCD_OK; }
/** * @ingroup SPI-DO * */ void bw_spi_relay_end(void) { FUNC_PREFIX(spi_end()); }
/** * @ingroup SPI-LCD * */ void bw_spi_lcd_end(void) { FUNC_PREFIX(spi_end()); }
/** * @ingroup I2C-RTC * */ void mcp7941x_end (void) { FUNC_PREFIX(i2c_end()); }
/** * @ingroup SPI-DIO * */ void bw_spi_dio_end(void) { FUNC_PREFIX(spi_end()); }