int davinci_i2c_init(char *bus_name) { struct rt_i2c_bus_device *bus; struct davinci_i2c_dev *dev; int r; bus = rt_malloc(sizeof(struct rt_i2c_bus_device)); if (bus == RT_NULL) { rt_kprintf("rt_malloc failed\n"); return -RT_ENOMEM; } rt_memset((void *)bus, 0, sizeof(struct rt_i2c_bus_device)); bus->ops = &bus_ops; bus->timeout = DAVINCI_I2C_TIMEOUT; dev = rt_malloc(sizeof(struct davinci_i2c_dev)); if (!dev) { r = -RT_ENOMEM; goto err; } rt_memset((void *)dev, 0, sizeof(struct davinci_i2c_dev)); rt_sem_init(&dev->completion, "i2c_ack", 0, RT_IPC_FLAG_FIFO); dev->irq = IRQ_I2C; dev->clk = clk_get("I2CCLK"); if (dev->clk == RT_NULL) { r = -RT_ERROR; goto err1; } psc_change_state(DAVINCI_DM365_LPSC_I2C, 3); dev->base = DAVINCI_I2C_BASE; dev->bus_freq = 100; dev->bus_delay = 0; bus->priv = dev; i2c_davinci_init(dev); rt_hw_interrupt_install(dev->irq, i2c_davinci_isr, (void *)dev, "I2C"); rt_hw_interrupt_umask(dev->irq); return rt_i2c_bus_device_register(bus, bus_name); err1: rt_free(dev); err: rt_free(bus); return r; }
/** * This function will init dm365 board */ void rt_hw_board_init() { psc_change_state(DAVINCI_DM365_LPSC_TIMER0, 3); psc_change_state(DAVINCI_DM365_LPSC_TIMER1, 3); /* initialize the system clock */ //rt_hw_clock_init(); davinci_clk_init(); /* initialize uart */ rt_hw_uart_init(); #ifdef RT_USING_CONSOLE rt_console_set_device(RT_CONSOLE_DEVICE_NAME); #endif /* initialize mmu */ rt_hw_mmu_init(dm365_mem_desc, sizeof(dm365_mem_desc)/sizeof(dm365_mem_desc[0])); /* initialize timer0 */ rt_hw_timer_init(); }