void mlo_erase() { static unsigned MSG = 0xaabbccdd; int ret = 0; u8 val; /*Enable USB mux pin cfg enable USB clock */ enable_irqs(); if (usb_open(&usbdev)) return -1; ret = mmc_init(1); if (ret != 0){ printf("\n MMC init failed \n"); goto error; } ret = mmc_erase(1, (1024*128/MMC_BLOCK_SIZE), 1024*128); usb_write(&usbdev, &MSG, 4); /*power off PMIC */ printf("erase ret %d Powering off!\n", ret); select_bus(CFG_I2C_BUS, CFG_I2C_SPEED); val = SWITCH_OFF; i2c_write(TWL6030_PMC_ID, PHOENIX_DEV_ON, 1, &val, 1); /* we should never get here */ error: hang(); }
void spin_unlock(spin_lock_t *lock) { #ifdef CONFIG_SMP lock->value = 0; lock->cpu = -1; #endif enable_irqs(); }
//Currently, kmain uses the interrupt stack. //It might overwrite ATAGs, etc. if care is not used. //TODO: allocate a stack elsewhere? void kmain(KMAIN_ARGS) { get_memory_map(); map_io_area(); bool status = init_console(); if(status) { init_phys_allocators(); //Drivers must be loaded before any heap allocations //because driver images are stored at the beginning of the heap. load_drivers(); interrupt_init(); enable_irqs(); //enable_irq(cpu_timer); } else { //To do: error handling. } }
static int load_from_usb(unsigned *_len, struct usb *usb) { unsigned len, n; enable_irqs(); usb_queue_read(usb, &len, 4); usb_write(usb, &MSG, 4); n = usb_wait_read(usb); if (n) return -1; if (usb_read(usb, (void*) CONFIG_ADDR_DOWNLOAD, len)) return -1; usb_close(usb); disable_irqs(); *_len = len; return 0; }
int usb_read_bootloader(int *_len) { long len = 0; int n = 0; unsigned long offset = (CFG_LOADADDR -0x120); static unsigned MSG = 0xaabbccdd; /*Enable USB mux pin cfg enable USB clock */ enable_irqs(); if (usb_open(&usbdev)) return -1; usb_queue_read(&usbdev, &len, 4); printf("USB write MSG flag\n"); usb_write(&usbdev, &MSG, 4); n = usb_wait_read(&usbdev); if (n) return -1; printf("USB read to %x len=%d\n", offset, len); if (usb_read(&usbdev, (void*) offset, len)) return -1; /* read the img file */ usb_queue_read(&usbdev, &len, 4); n = usb_wait_read(&usbdev); if (n) return -1; /* read the boot.img for booti command */ printf("USB read2 to %x len=%d\n", 0x81000000, len); if (usb_read(&usbdev, (void*) 0x81000000, len)) return -1; usb_close(&usbdev); disable_irqs(); *_len = len; return 0; }
void mainfunction() { uint8_t header, data; bool received_data = false; enable_irqs(); while (true) { if (received_data) { int twi_send_err = 0; // Send to right instance depending on header if (header == 0x00) { // FireFly is sending control commands. Relay to control module. twi_send_err = TWI_master_send_message(TWI_CONTROL_MODULE_ADDRESS, header, data); } else if (header == 0x01) { // Control module is sending. Relay to firefly cli(); USART_transmit(header, data); sei(); } else if (header == 0x02) { // FireFly is sending a calibration command. Relay to sensor module. twi_send_err = TWI_master_send_message(TWI_SENSOR_MODULE_ADDRESS, header, data); } else if (header >= 0x03 && header <= 0x0B) { // Sensor module is sending. Relay to control module and FireFly. twi_send_err = TWI_master_send_message(TWI_CONTROL_MODULE_ADDRESS, header, data); cli(); USART_transmit(header, data); sei(); } else if (header == 0x0C) { // Error. Relay to FireFly. cli(); USART_transmit(header, data); sei(); // } else if(header==0x0D) { #ifdef USE_PING ping_received=true; #endif } else { // Invalid header. Send error message send_error(0x00); } // If there was any error with TWI if (twi_send_err) { // TWI error. Send error message. send_error(0x01); } received_data = false; } #ifdef USE_PING else if (ping_counter<0) { ping_counter=1<<16; cli(); USART_transmit(0x0D , 0x00); sei(); if(!ping_received) TWI_master_send_message(TWI_CONTROL_MODULE_ADDRESS , 0x00 , 0x06); ping_received=0; } #endif int twi_rec_err = 0; if (sensor_module_interrupt) { sensor_module_interrupt = false; // Get data from sensor module twi_rec_err = TWI_master_receive_message(TWI_SENSOR_MODULE_ADDRESS, &header, &data); received_data = true; } else if (control_module_interrupt) { control_module_interrupt = false; // Get data from control module twi_rec_err = TWI_master_receive_message(TWI_CONTROL_MODULE_ADDRESS, &header, &data); received_data = true; } else if (firefly_received_data) { cli(); header = firefly_header; data = firefly_data; firefly_received_data = false; received_data = true; sei(); } if (twi_rec_err) { // TWI error. Send error message. send_error(0x02); } #ifdef USE_PING ping_counter--; #endif } }