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, &reg, 1, &s, 1);
	
	if(!ret) {
		// FIXME
		// Try harder ...
		ret = i2c_master_transfert_block(i2c_bus, RF_ADDRESS, &reg, 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];
	}
}
Exemple #5
0
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);
        }
}
Exemple #6
0
static void wait_dot(void) {
	int i;
	for(i = 0; i < 50; i++)
		clock_delay_us(10000);
}