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();
}
示例#2
0
void spin_unlock(spin_lock_t *lock)
{
#ifdef CONFIG_SMP
	lock->value = 0;
	lock->cpu = -1;
#endif
	enable_irqs();
}
示例#3
0
文件: main.c 项目: blm768/arm-os
//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.
	}
}
示例#4
0
文件: aboot.c 项目: aneeshv/omapboot
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;
}
示例#6
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
	}
}