static void i2c_write_bit(unsigned int bit) { if(bit) { MM_WRITE(MM_BT656_I2C, BT656_I2C_SDAOE|BT656_I2C_SDAOUT); } else { MM_WRITE(MM_BT656_I2C, BT656_I2C_SDAOE); } i2c_delay(); MM_WRITE(MM_BT656_I2C, MM_READ(MM_BT656_I2C) | BT656_I2C_SDC); i2c_delay(); MM_WRITE(MM_BT656_I2C, MM_READ(MM_BT656_I2C) & ~BT656_I2C_SDC); }
static rtems_isr mmconsole_interrupt(rtems_vector_number n) { char c; while (MM_READ(MM_UART_STAT) & UART_STAT_RX_EVT) { c = MM_READ(MM_UART_RXTX); MM_WRITE(MM_UART_STAT, UART_STAT_RX_EVT); rtems_termios_enqueue_raw_characters(tty, &c, 1); } if (MM_READ(MM_UART_STAT) & UART_STAT_TX_EVT) { MM_WRITE(MM_UART_STAT, UART_STAT_TX_EVT); rtems_termios_dequeue_characters(tty, 1); } lm32_interrupt_ack(1 << MM_IRQ_UART); }
static rtems_isr rx_interrupt_handler(rtems_vector_number vector) { /* Deassert IRQ line. * The RX daemon will then read all the slots we marked as empty. */ if(MM_READ(MM_MINIMAC_STATE0) == MINIMAC_STATE_PENDING) MM_WRITE(MM_MINIMAC_STATE0, MINIMAC_STATE_EMPTY); if(MM_READ(MM_MINIMAC_STATE1) == MINIMAC_STATE_PENDING) MM_WRITE(MM_MINIMAC_STATE1, MINIMAC_STATE_EMPTY); rtems_bsdnet_event_send(rx_daemon_id, RX_EVENT); lm32_interrupt_ack(1 << MM_IRQ_ETHRX); }
static void swap_buffers(void) { unsigned short int *p; /* Make sure last buffer swap has been executed */ while (MM_READ(MM_VGA_BASEADDRESS_ACT) != MM_READ(MM_VGA_BASEADDRESS)); p = frontbuffer; frontbuffer = backbuffer; backbuffer = lastbuffer; lastbuffer = p; fb_fix.smem_start = (volatile char *)backbuffer; MM_WRITE(MM_VGA_BASEADDRESS, (unsigned int)frontbuffer); }
static int get_soc_version(char *buffer) { char fmt[13]; char *version; int len; unsigned int id; unsigned int major, minor, subminor, rc; id = MM_READ(MM_SYSTEM_ID); major = (id & 0xf0000000) >> 28; minor = (id & 0x0f000000) >> 24; subminor = (id & 0x00f00000) >> 20; rc = (id & 0x000f0000) >> 16; version = fmt; version += sprintf(version, "%u.%u", major, minor); if (subminor != 0) version += sprintf(version, ".%u", subminor); if (rc != 0) version += sprintf(version, "RC%u", rc); len = version - fmt; memcpy(buffer, fmt, len); return len; }
static void icap_write(int val, unsigned int w) { while (!(MM_READ(MM_ICAP) & ICAP_READY)); if (!val) w |= ICAP_CE|ICAP_WRITE; MM_WRITE(MM_ICAP, w); }
void Clock_driver_support_initialize_hardware(void) { MM_WRITE(MM_TIMER0_COMPARE, (MM_READ(MM_FREQUENCY)/(1000000/rtems_configuration_get_microseconds_per_tick()))); MM_WRITE(MM_TIMER0_COUNTER, 0); MM_WRITE(MM_TIMER0_CONTROL, TIMER_ENABLE | TIMER_AUTORESTART); bsp_interrupt_vector_enable(MM_IRQ_TIMER0); }
static rtems_isr interrupt_handler(rtems_vector_number n) { unsigned short int msg; lm32_interrupt_ack(1 << MM_IRQ_IR); msg = MM_READ(MM_IR_RX); rtems_message_queue_send(ir_q, &msg, 2); }
static int get_pcb_revision(char *buffer) { unsigned int v; v = MM_READ(MM_GPIO_IN); v = (v & 0x78) >> 3; buffer[0] = '0' + v; return 1; }
static int get_pcb_type(char *buffer) { unsigned int id; id = MM_READ(MM_SYSTEM_ID); buffer[0] = (id & 0x0000ff00) >> 8; buffer[1] = id & 0x000000ff; return 2; }
static void rx_daemon(void *arg) { rtems_event_set events; while(1) { rtems_bsdnet_event_receive(RX_EVENT, RTEMS_EVENT_ANY | RTEMS_WAIT, RTEMS_NO_TIMEOUT, &events); if(MM_READ(MM_MINIMAC_STATE0) == MINIMAC_STATE_EMPTY) { receive_packet((uint8_t *)MINIMAC_RX0_BASE, MM_READ(MM_MINIMAC_COUNT0)); MM_WRITE(MM_MINIMAC_STATE0, MINIMAC_STATE_LOADED); } if(MM_READ(MM_MINIMAC_STATE1) == MINIMAC_STATE_EMPTY) { receive_packet((uint8_t *)MINIMAC_RX1_BASE, MM_READ(MM_MINIMAC_COUNT1)); MM_WRITE(MM_MINIMAC_STATE1, MINIMAC_STATE_LOADED); } } }
benchmark_timer_t benchmark_timer_read(void) { uint32_t ticks; uint32_t total; ticks = MM_READ(MM_TIMER1_COUNTER); if (ticks == 0xffffffff) printk("Timer overflow!\n"); total = ticks / (MM_READ(MM_FREQUENCY) / 1000000); if (benchmark_timer_find_average_overhead) return total; else { if (total < LEAST_VALID) return 0; return (total - AVG_OVERHEAD); } }
static void i2c_start_cond(void) { if(i2c_started) { /* set SDA to 1 */ MM_WRITE(MM_BT656_I2C, BT656_I2C_SDAOE|BT656_I2C_SDAOUT); i2c_delay(); MM_WRITE(MM_BT656_I2C, MM_READ(MM_BT656_I2C) | BT656_I2C_SDC); } /* SCL is high, set SDA from 1 to 0 */ MM_WRITE(MM_BT656_I2C, BT656_I2C_SDAOE|BT656_I2C_SDC); i2c_delay(); MM_WRITE(MM_BT656_I2C, BT656_I2C_SDAOE); i2c_started = 1; }
rtems_device_driver video_close( rtems_device_major_number major, rtems_device_minor_number minor, void *arg ) { int i; MM_WRITE(MM_BT656_FILTERSTATUS, 0); while(MM_READ(MM_BT656_FILTERSTATUS) & BT656_FILTER_INFRAME); for(i=0;i<N_BUFFERS;i++) free(buffers[i]); return RTEMS_SUCCESSFUL; }
/* I2C bit-banging functions from http://en.wikipedia.org/wiki/I2c */ static unsigned int i2c_read_bit(void) { unsigned int bit; /* Let the slave drive data */ MM_WRITE(MM_BT656_I2C, 0); i2c_delay(); MM_WRITE(MM_BT656_I2C, BT656_I2C_SDC); i2c_delay(); bit = MM_READ(MM_BT656_I2C) & BT656_I2C_SDAIN; i2c_delay(); MM_WRITE(MM_BT656_I2C, 0); return bit; }
static int read_cr(unsigned int adr) { rtems_status_code sc; MM_WRITE(MM_AC97_CRADDR, adr); MM_WRITE(MM_AC97_CRCTL, AC97_CRCTL_RQEN); sc = rtems_semaphore_obtain(cr_write_sem, RTEMS_WAIT, CR_TIMEOUT); if (sc != RTEMS_SUCCESSFUL) return -1; sc = rtems_semaphore_obtain(cr_read_sem, RTEMS_WAIT, CR_TIMEOUT); if (sc != RTEMS_SUCCESSFUL) return -1; return MM_READ(MM_AC97_CRDATAIN); }
static int mmconsole_set_attributes(int minor, const struct termios *t) { int baud; switch (t->c_cflag & CBAUD) { case B0: baud = 0; break; case B50: baud = 50; break; case B75: baud = 75; break; case B110: baud = 110; break; case B134: baud = 134; break; case B150: baud = 150; break; case B200: baud = 200; break; case B300: baud = 300; break; case B600: baud = 600; break; case B1200: baud = 1200; break; case B1800: baud = 1800; break; case B2400: baud = 2400; break; case B4800: baud = 4800; break; case B9600: baud = 9600; break; case B19200: baud = 19200; break; case B38400: baud = 38400; break; case B57600: baud = 57600; break; case B115200: baud = 115200; break; case B230400: baud = 230400; break; case B460800: baud = 460800; break; default: baud = -1; break; } if (baud > 0) MM_WRITE(MM_UART_DIV, MM_READ(MM_FREQUENCY)/baud/16); return 0; }