// fatal error void FatalError(void) { DEBUG_FUNC_IN(); DisableCard(); // loop forever while(1) { TIMER_wait(200); LEDS(0x0); TIMER_wait(200); LEDS(led); } DEBUG_FUNC_OUT(); }
//// FatalError() //// void FatalError(unsigned long error) { DEBUG_FUNC_IN(); sprintf(s,"Fatal error: %lu", error); BootPrintEx(s); printf(s); // loop forever while(1) { TIMER_wait(200); LEDS(0x0); TIMER_wait(200); LEDS(error); } DEBUG_FUNC_OUT(); }
void main(void) { DEBUG_FUNC_IN(); fileTYPE ft; int i; // !!! a pointer to start of RAM unsigned char * ram = ((unsigned char *)0x400000); // initialize SD card LEDS(led=0xf); if (!MMC_Init()) FatalError(); // find drive LEDS(led=0x8); if (!FindDrive()) FatalError(); // open file LEDS(led=0x3); LoadFile(firmware,ram); #if 0 if (!FileOpen(&ft, firmware)) FatalError(); // load firmware to RAM LEDS(led=0x1); for(i=0; i<((ft.size>>9)+1); i++) { FileRead(&ft, ram+(i*512)); FileNextSector(&ft); } #endif // jump to RAM firmware LEDS(led=0x0); DisableCard(); sys_jump(0x400004); // loop forever while(1); DEBUG_FUNC_OUT(); }
static ssize_t proc_leds_read(struct file *file, char __user * outbuffer, size_t size, loff_t * ppos) { int ret = 0; char buffer[32]; unsigned long val = gpio_get(); sprintf(buffer, "0x%02X\n%s %s %s", LEDS(val), (val & LED_BLUE_MASK)?LED_BLUE_STR_ON:LED_BLUE_STR_OFF, (val & LED_POWER_MASK)?LED_POWER_STR_ON:LED_POWER_STR_OFF, (val & LED_GREEN_MASK)?LED_GREEN_STR_ON:LED_GREEN_STR_OFF); if (vs_sysid == VS_SYSID_ARETE) { strcat(buffer,!(val & LED_BTN_WLAN_MASK) ? " "LED_BTN_WLAN_STR_ON : " "LED_BTN_WLAN_STR_OFF); } strcat(buffer,"\n"); ret = strlen(buffer); return simple_read_from_buffer(outbuffer, size, ppos, buffer, ret); }
static long gpio_ioctl(struct file * file, unsigned int cmd, unsigned long arg) { unsigned long val; switch(cmd) { case GPIO_CMD_SET_BTN_RST: if (copy_from_user(&val, (unsigned long*)arg, sizeof(val))) return -EFAULT; if (val) DO_RESET(); break; case GPIO_CMD_GET_BTN_RST: val = BUTTON_RESET(); if (copy_to_user((unsigned long *)arg, &val, sizeof(val))) return -EFAULT; break; case GPIO_CMD_SET_LED_BTN_WLAN: if (vs_sysid != VS_SYSID_ARETE) return -EFAULT; if (copy_from_user(&val, (unsigned long*)arg, sizeof(val))) return -EFAULT; gpio_set(LED_BTN_WLAN_MASK,!val?LED_BTN_WLAN_MASK:0UL); break; case GPIO_CMD_GET_BTN_WLAN: if (vs_sysid != VS_SYSID_ARETE) return -EFAULT; val = BUTTON_WLAN(); if (copy_to_user((unsigned long *)arg, &val, sizeof(val))) return -EFAULT; break; case GPIO_CMD_SET_LEDS: if (copy_from_user(&val, (unsigned long*)arg, sizeof(val))) return -EFAULT; gpio_set(MASK_LEDS, led2reg(val)); break; case GPIO_CMD_GET_LEDS: val = LEDS(gpio_get()); if (copy_to_user((unsigned long *)arg, &val, sizeof(val))) return -EFAULT; break; case GPIO_CMD_SET_LED_POWER: if (copy_from_user(&val, (unsigned long*)arg, sizeof(val))) return -EFAULT; gpio_set(LED_POWER_MASK, val?LED_POWER_MASK:0UL); break; case GPIO_CMD_SET_LED_BLUE: if (copy_from_user(&val, (unsigned long*)arg, sizeof(val))) return -EFAULT; gpio_set(LED_BLUE_MASK, val?LED_BLUE_MASK:0UL); break; case GPIO_CMD_SET_LED_GREEN: if (copy_from_user(&val, (unsigned long*)arg, sizeof(val))) return -EFAULT; gpio_set(LED_GREEN_MASK, val?LED_GREEN_MASK:0UL); break; // buzzer case GPIO_CMD_SET_BUZZER: if (copy_from_user(&val, (unsigned long*)arg, sizeof(val))) return -EFAULT; if (val == 1) set_buzzer(1); else if(val == 0) set_buzzer(0); else return -EINVAL; break; case GPIO_CMD_GET_BUZZER: val = (gpio_get() & BUZZER_MASK)?1:0; if (copy_to_user((unsigned long *)arg, &val, sizeof(val))) return -EFAULT; break; case GPIO_CMD_SET_BUZZER_FRQ: if (copy_from_user(&val, (unsigned long*)arg, sizeof(val))) return -EFAULT; if((val < FREQ_MIN) || (val > FREQ_MAX)) return -EINVAL; // check if thread has been already activated if(freq_thread != NULL) { kthread_stop(freq_thread); freq_thread = NULL; } buzzer_freq = val; freq_thread = kthread_run(buzzer_thread, NULL, "buzzer thread"); if(IS_ERR(freq_thread)) { printk("Error starting kthread\n"); freq_thread = NULL; } break; case GPIO_CMD_GET_BUZZER_FRQ: val = buzzer_freq; if (copy_to_user((unsigned long *)arg, &val, sizeof(val))) return -EFAULT; break; // external GPIOs case GPIO_CMD_SET: { struct gpio_struct set; if (copy_from_user(&set, (struct gpio_struct*)arg, sizeof(set))) return -EFAULT; gpio_ext_set(set.mask, set.value); } break; case GPIO_CMD_GET: val = gpio_ext_get(); if (copy_to_user((unsigned long *)arg, &val, sizeof(val))) return -EFAULT; break; case GPIO_CMD_SET_CTRL: { struct gpio_struct set; if (copy_from_user(&set, (struct gpio_struct*)arg, sizeof(set))) return -EFAULT; // relays are not to be switched to input and isolated inputs are not to be switched to output if(vs_sysid == VS_SYSID_ALENA) { if((set.mask & GPIO_BIT_0 && set.value & GPIO_BIT_0) || (set.mask & GPIO_BIT_1 && set.value & GPIO_BIT_1) || (set.mask & GPIO_BIT_6 && !(set.value & GPIO_BIT_6)) || (set.mask & GPIO_BIT_7 && !(set.value & GPIO_BIT_7))) return -EINVAL; } gpio_ext_set_mode(set.mask, set.value); } break; case GPIO_CMD_GET_CTRL: val = gpio_ext_get_mode(); if (copy_to_user((unsigned long *)arg, &val, sizeof(val))) return -EFAULT; break; case GPIO_CMD_SET_IRQMASK: { struct gpio_struct set; if (copy_from_user(&set, (struct gpio_struct*)arg, sizeof(set))) return -EFAULT; gpio_ext_set_irqmask(set.mask, set.value); } break; case GPIO_CMD_GET_IRQMASK: val = gpio_ext_get_irqmask(); if (copy_to_user((unsigned long *)arg, &val, sizeof(val))) return -EFAULT; break; case GPIO_CMD_GET_CHANGE: val = gpio_ext_get_change(); if (copy_to_user((unsigned long *)arg, &val, sizeof(val))) return -EFAULT; break; case GPIO_CMD_GET_CHANGES: if (copy_from_user(&val, (unsigned long*)arg, sizeof(unsigned long))) return -EFAULT; if (val >= NUMBER_OF_GPIOS) return -EFAULT; if (copy_to_user((unsigned long*)arg, &gpio_ext_irq_changes[val], sizeof(gpio_ext_irq_changes[0]))) return -EFAULT; break; default: return -EINVAL; } return 0; }