// // Fill in the details of a PCMCIA slot and initialize the device // void cf_hwr_init(struct cf_slot *slot) { static int int_init = 0; unsigned long new_state = *SA11X0_GPIO_PIN_LEVEL; if (!int_init) { int_init = 1; #ifdef CYGPKG_KERNEL // Set up interrupts cyg_drv_interrupt_create(SA1110_CF_DETECT, 99, // Priority - what goes here? (cyg_addrword_t) slot, // Data item passed to interrupt handler (cyg_ISR_t *)cf_detect_isr, (cyg_DSR_t *)cf_detect_dsr, &cf_detect_interrupt_handle, &cf_detect_interrupt); cyg_drv_interrupt_attach(cf_detect_interrupt_handle); cyg_drv_interrupt_configure(SA1110_CF_DETECT, true, true); // Detect either edge cyg_drv_interrupt_acknowledge(SA1110_CF_DETECT); cyg_drv_interrupt_unmask(SA1110_CF_DETECT); cyg_drv_interrupt_create(SA1110_CF_IRQ, 99, // Priority - what goes here? (cyg_addrword_t) slot, // Data item passed to interrupt handler (cyg_ISR_t *)cf_irq_isr, (cyg_DSR_t *)cf_irq_dsr, &cf_irq_interrupt_handle, &cf_irq_interrupt); cyg_drv_interrupt_attach(cf_irq_interrupt_handle); cyg_drv_interrupt_unmask(SA1110_CF_IRQ); #endif cyg_drv_interrupt_configure(SA1110_CF_IRQ, false, false); // Falling edge cyg_drv_interrupt_acknowledge(SA1110_CF_IRQ); } slot->attr = (unsigned char *)0x38000000; slot->attr_length = 0x200; slot->io = (unsigned char *)0x30000000; slot->io_length = 0x04000000; slot->mem = (unsigned char *)0x3C000000; slot->mem_length = 0x04000000; slot->int_num = SA1110_CF_IRQ; #ifdef CYG_HAL_STARTUP_ROM // Disable CF bus & power (idle/off) assabet_BCR(SA1110_BCR_CF_POWER | SA1110_BCR_CF_RESET | SA1110_BCR_CF_BUS, SA1110_BCR_CF_POWER_OFF | SA1110_BCR_CF_RESET_DISABLE | SA1110_BCR_CF_BUS_OFF); #endif if ((new_state & SA1110_GPIO_CF_DETECT) == SA1110_GPIO_CF_PRESENT) { if ((_assabet_BCR & SA1110_BCR_CF_POWER) == SA1110_BCR_CF_POWER_ON) { // Assume that the ROM environment has turned the bus on slot->state = CF_SLOT_STATE_Ready; } else { slot->state = CF_SLOT_STATE_Inserted; } } else { slot->state = CF_SLOT_STATE_Empty; } }
// // Transition the card/slot to a new state // note: currently only supports transitions to Ready, Empty // bool cf_hwr_change_state(struct cf_slot *slot, int new_state) { int i, ptr, len; unsigned char buf[256]; if (new_state == CF_SLOT_STATE_Ready) { if (slot->state == CF_SLOT_STATE_Inserted) { assabet_BCR(SA1110_BCR_CF_POWER | SA1110_BCR_CF_RESET | SA1110_BCR_CF_BUS, SA1110_BCR_CF_POWER_ON | SA1110_BCR_CF_RESET_DISABLE | SA1110_BCR_CF_BUS_OFF); do_delay(30); // At least 300 ms slot->state = CF_SLOT_STATE_Powered; assabet_BCR(SA1110_BCR_CF_POWER | SA1110_BCR_CF_RESET | SA1110_BCR_CF_BUS, SA1110_BCR_CF_POWER_ON | SA1110_BCR_CF_RESET_ENABLE | SA1110_BCR_CF_BUS_ON); do_delay(1); // At least 10 us slot->state = CF_SLOT_STATE_Reset; assabet_BCR(SA1110_BCR_CF_POWER | SA1110_BCR_CF_RESET | SA1110_BCR_CF_BUS, SA1110_BCR_CF_POWER_ON | SA1110_BCR_CF_RESET_DISABLE | SA1110_BCR_CF_BUS_ON); do_delay(5); // At least 20 ms // Wait until the card is ready to talk for (i = 0; i < 10; i++) { ptr = 0; if (cf_get_CIS(slot, CF_CISTPL_VERS_1, buf, &len, &ptr)) { slot->state = CF_SLOT_STATE_Ready; break; } do_delay(10); } } } }
static void lcd_test(cyg_addrword_t p) { int i, pix, row, col; int on; diag_printf("LCD test here\n"); lcd_init(16); #if 0 for (i = 0; i < 16; i++) { on = true; diag_printf("Fill with 0x%x\n", i); for (row = 0; row < 240; row++) { for (col = 0; col < 320/2; col++) { if (on) { fp->pixels[row][col] = RGB_RED(i)|RGB_GREEN(i)|RGB_BLUE(i); } else { fp->pixels[row][col] = 0xFFFF; } } for (col = 320/2; col < 320; col++) { if (!on) { fp->pixels[row][col] = RGB_RED(i)|RGB_GREEN(i)|RGB_BLUE(i); } else { fp->pixels[row][col] = 0xFFFF; } } if ((row & 0x0F) == 0x0F) { if (on) { on = false; } else { on = true; } } } cyg_thread_delay(100); } #endif #if 0 for (i = 0; i < 4; i++) { for (row = 0; row < 240; row++) { for (col = 0; col < 320; col++) { switch (row/40) { case 0: pix = col / 20; // 0..15 fp->pixels[row][col] = RGB_RED(pix); break; case 1: pix = col / 10; // 0..31 fp->pixels[row][col] = RGB_GREEN(pix); break; case 2: pix = col / 20; // 0..15 fp->pixels[row][col] = RGB_BLUE(pix); break; case 3: pix = col / 20; // 0..15 fp->pixels[row][col] = RGB_BLUE(pix) | RGB_GREEN(pix); break; case 4: pix = col / 20; // 0..15 fp->pixels[row][col] = RGB_BLUE(15) | RGB_GREEN(pix); break; case 5: fp->pixels[row][col] = 0xFFFF; break; } } } cyg_thread_delay(100); #if 0 for (row = 0; row < 240; row++) { for (col = 0; col < 320; col++) { pix = col / 20; // 0..15 switch (row/60) { case 0: fp->pixels[row][col] = RGB_RED(pix); break; case 1: fp->pixels[row][col] = RGB_GREEN(pix); break; case 2: fp->pixels[row][col] = RGB_BLUE(pix); break; case 3: fp->pixels[row][col] = 0xFFFF; break; } } } cyg_thread_delay(100); #endif #if 0 on = true; for (row = 0; row < 240; row++) { for (col = 0; col < 320/2; col++) { if (on) { fp->pixels[row][col] = RGB_GREEN(15); } else { fp->pixels[row][col] = RGB_BLUE(8); } } for (col = 320/2; col < 320; col++) { if (!on) { fp->pixels[row][col] = RGB_GREEN(15); } else { fp->pixels[row][col] = RGB_BLUE(8); } } if ((row & 0x0F) == 0x0F) { if (on) { on = false; } else { on = true; } } } #endif } #endif #if 0 for (row = 0; row < 240; row++) { for (col = 0; col < 320; col++) { if (col == 59) { fp->pixels[row][col] = 0x0000; } else { fp->pixels[row][col] = 0xFFFF; } } } cyg_thread_delay(100); #endif #if 0 for (i = 0; i < 16; i++) { diag_printf("Value 0x%04x\n", (1<<i)); for (row = 0; row < 240; row++) { for (col = 0; col < 320; col++) { fp->pixels[row][col] = (1<<i); } } cyg_thread_delay(500); } #endif #if 0 for (i = 0; i < 32; i++) { diag_printf("Red at %d\n", i); for (row = 0; row < 240; row++) { for (col = 0; col < 320; col++) { fp->pixels[row][col] = RGB_RED(i); } } cyg_thread_delay(100); } #endif #if 0 for (i = 0; i < 64; i++) { diag_printf("Green at %d\n", i); for (row = 0; row < 240; row++) { for (col = 0; col < 320; col++) { fp->pixels[row][col] = RGB_GREEN(i); } } cyg_thread_delay(100); } #endif #if 0 for (i = 0; i < 32; i++) { diag_printf("BLUE at %d\n", i); for (row = 0; row < 240; row++) { for (col = 0; col < 320; col++) { fp->pixels[row][col] = RGB_BLUE(i); } } cyg_thread_delay(100); } #endif while (true) { for (i = 0; i < 1; i++) { show_xpm(redboot_xpm); cyg_thread_delay(15); show_xpm(eCos_xpm); cyg_thread_delay(25); show_xpm(redboot_xpm); cyg_thread_delay(15); show_xpm(redhat_xpm); cyg_thread_delay(25); show_xpm(redboot_xpm); cyg_thread_delay(25); show_xpm(redboot_xpm); cyg_thread_delay(15); show_xpm(escw_xpm); cyg_thread_delay(25); show_xpm(redboot_xpm); cyg_thread_delay(15); show_xpm(eCos2_xpm); cyg_thread_delay(25); show_xpm(redboot_xpm); cyg_thread_delay(15); show_xpm(redhat2_xpm); cyg_thread_delay(25); show_xpm(logo_xpm); cyg_thread_delay(25); show_xpm(redboot_xpm); cyg_thread_delay(50); } #if 0 // This doesn't seem to do anything on my unit assabet_BCR(SA1110_BCR_MOTOR, SA1110_BCR_MOTOR_ON); cyg_thread_delay(2*100); assabet_BCR(SA1110_BCR_MOTOR, SA1110_BCR_MOTOR_OFF); #endif show_xpm(redboot_xpm); cyg_thread_delay(15); lcd_clear(); lcd_printf("\n\n**** Hello world!\n"); cyg_thread_delay(5); for (i = 0; i < 64; i++) { lcd_printf("... testing line #%d\n", i); } cyg_thread_delay(50); show_xpm(redboot_xpm); cyg_thread_delay(15); set_bg(0,0,0); set_fg(31,63,0); lcd_clear(); for (i = 0; i < 32; i++) { lcd_printf("... testing line #%d\n", i); } cyg_thread_delay(50); } // while lcd_clear(); lcd_printf("*****"); cyg_thread_delay(200); cyg_test_exit(); }