void rf_init(int bus) { unsigned int flags; unsigned char reg = REG_STATUS; unsigned char s; unsigned char ret; clock_delay_us(5000); // we need to wait until the chip is ready .... RAISE_IPL(flags, PRIO_COMMUNICATION); i2c_bus = bus; // Wait until the bus is idle while(i2c_master_is_busy(i2c_bus)); // Try to access the chip ret = i2c_master_transfert_block(i2c_bus, RF_ADDRESS, ®, 1, &s, 1); if(!ret) { // FIXME // Try harder ... ret = i2c_master_transfert_block(i2c_bus, RF_ADDRESS, ®, 1, &s, 1); } IRQ_ENABLE(flags); if (ret) { write(REG_CTRL, 3); // Put us in presence detect only status = RF_PRESENT | RF_LINK_UP; } else { status = 0; } }
void leds_poweroff(void) { LED_CS = 0; clock_delay_us(LEDS_WAIT); SPI1BUF = leds_off[0]; SPI1BUF = leds_off[1]; SPI1BUF = leds_off[2]; SPI1BUF = leds_off[3]; SPI1BUF = leds_off[4]; clock_delay_us(LEDS_WAIT); LED_CS = 1; clock_delay_us(1); LED_CS = 0; SPI1STATbits.SPIEN = 0; va_put(); }
void mma7660_init(int i2c, unsigned char address, mma7660_cb ucb, int prio) { i2c_bus = i2c; i2c_address = address; cb = ucb; va_get(); // Enable Va LDO clock_delay_us(1300); /* Configure device */ write(MODE, MODE_CONFIG_OFF); // Reset if(prio) write(INT_SETUP, 1 << GINT); // Enable auto interrupt on update (GINT) else write(INT_SETUP, 0); /* Configure PIC */ TRISDbits.TRISD7 = 1; // Set RD7 pin as input // CNPU2bits.CN16PUE = 1; // Enable internal pull-up resistor /* Configure interrupts */ if(prio) { IPC4bits.CNIP = prio; // CN interrupt priority IFS1bits.CNIF = 0; // Clear flag CNEN2bits.CN16IE = 1; // Enable CN16 interrupt IEC1bits.CNIE = 1; // Enable CN interrupt } }
void leds_init(void) { int i; LED_CS = 0; va_get(); clock_delay_us(1000); // Wait until VA raise SPI1STAT = 0; SPI1CON1bits.DISSCK = 0; SPI1CON1bits.DISSDO = 0; SPI1CON1bits.MODE16 = 0; SPI1CON1bits.SMP = 0; SPI1CON1bits.CKE = 0; SPI1CON1bits.SSEN = 0; SPI1CON1bits.CKP = 0; SPI1CON1bits.MSTEN = 1; SPI1CON1bits.SPRE = 0b110; // Secondary 2:1. Spi clock 8Mhz SPI1CON1bits.PPRE = 0x3; // Primary 1:1 SPI1CON2 = 1; // bufferized mode // enable SPI module SPI1STATbits.SPIEN = 1; // Write the init leds sequence: SPI1BUF = leds_off[0]; SPI1BUF = leds_off[1]; SPI1BUF = leds_off[2]; SPI1BUF = leds_off[3]; SPI1BUF = leds_off[4]; clock_delay_us(LEDS_WAIT); LED_CS = 1; // Fill the array with default off value for(i = 0; i < MAX_BRIGHTNESS; i++) { led[i*5] = leds_off[0]; led[i*5 + 1] = leds_off[1]; led[i*5 + 2] = leds_off[2]; led[i*5 + 3] = leds_off[3]; led[i*5 + 4] = leds_off[4]; } }
static void wait_valid_vbat(void) { int i; vmVariables.vbat[0] = 0; barrier(); for(i = 0; i < 10000; i++) { if(vmVariables.vbat[0]) break; clock_delay_us(1); } }
static void wait_dot(void) { int i; for(i = 0; i < 50; i++) clock_delay_us(10000); }