/*
 * pios_i2c_config.h
 *
 *  Created on: May 8, 2011
 *      Author: Michael Smith
 */

#ifndef PIOS_I2C_CONFIG_H_
#define PIOS_I2C_CONFIG_H_

/**
 * Generic I2C configuration for the STM32F4xx
 */
#define I2C_CONFIG(_i2c, _scl_gpio, _scl_pin, _sda_gpio, _sda_pin) 		\
{                                                                       \
    .regs = _i2c,                                                       \
    .remap = GPIO_AF_ ## _i2c,                                          \
    .init = {                                                           \
        .I2C_ClockSpeed          = 400000,  /* bits/s */                \
        .I2C_Mode                = I2C_Mode_I2C,                        \
        .I2C_DutyCycle           = I2C_DutyCycle_2,                     \
        .I2C_OwnAddress1         = 0,                                   \
        .I2C_Ack                 = I2C_Ack_Enable,                      \
        .I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit,        \
    },                                                                  \
    .transfer_timeout_ms = 50,                                          \
    .scl = {                                                            \
        .gpio = _scl_gpio,                                              \
        .init = {                                                       \
            .GPIO_Pin   = _scl_pin,                                     \
            .GPIO_Mode  = GPIO_Mode_AF,                                 \
            .GPIO_Speed = GPIO_Speed_50MHz,                             \
            .GPIO_OType = GPIO_OType_OD,                                \
            .GPIO_PuPd  = GPIO_PuPd_NOPULL,                             \
        },                                                              \
    },                                                                  \
    .sda = {                                                            \
        .gpio = _sda_gpio,                                              \
        .init = {                                                       \
            .GPIO_Pin   = _sda_pin,                                     \
            .GPIO_Mode  = GPIO_Mode_AF,                                 \
            .GPIO_Speed = GPIO_Speed_50MHz,                             \
            .GPIO_OType = GPIO_OType_OD,                                \
            .GPIO_PuPd  = GPIO_PuPd_NOPULL,                             \
        },                                                              \
    },                                                                  \
    .event = {                                                          \
        .flags   = 0,       /* FIXME: check this */                     \
        .init = {                                                       \
            .NVIC_IRQChannel                   = _i2c ## _EV_IRQn,      \
            .NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_HIGHEST, \
            .NVIC_IRQChannelSubPriority        = 0,                     \
            .NVIC_IRQChannelCmd                = ENABLE,                \
        },                                                              \
    },                                                                  \
    .error = {                                                          \
        .flags   = 0,       /* FIXME: check this */                     \
        .init = {                                                       \
            .NVIC_IRQChannel                   = _i2c ## _ER_IRQn,      \
            .NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_HIGHEST, \
            .NVIC_IRQChannelSubPriority        = 0,                     \
            .NVIC_IRQChannelCmd                = ENABLE,                \
        },                                                              \
    },                                                                  \
}

#endif /* PIOS_I2C_CONFIG_H_ */