1.为提速软件模拟效率,引入快速Pin,注意此接口仅为模拟接口使用,请不要随意使用此接口,严禁跳过设备框架在应用层使用此功能(如果不遵守,将破坏软件架构,导致解耦失效)。
This commit is contained in:
@@ -12,8 +12,11 @@
|
||||
|
||||
#ifdef MR_USING_PIN
|
||||
#include "include/device/mr_pin.h"
|
||||
int _mr_fast_pin_mode(int number, int mode);
|
||||
uint8_t _mr_fast_pin_read(int number);
|
||||
void _mr_fast_pin_write(int number, int value);
|
||||
#else
|
||||
#warning "Please define MR_USING_PIN. Otherwise Soft-I2C will not work."
|
||||
#error "Please define MR_USING_PIN. Otherwise Soft-I2C will not work."
|
||||
#endif /* MR_USING_PIN */
|
||||
|
||||
#define SOFT_I2C_LOW 0
|
||||
@@ -21,23 +24,17 @@
|
||||
|
||||
MR_INLINE void soft_i2c_scl_set(struct mr_soft_i2c_bus *soft_i2c_bus, uint8_t value)
|
||||
{
|
||||
mr_dev_ioctl(soft_i2c_bus->desc, MR_CTL_PIN_SET_NUMBER, &soft_i2c_bus->scl_pin);
|
||||
mr_dev_write(soft_i2c_bus->desc, &value, sizeof(value));
|
||||
_mr_fast_pin_write(soft_i2c_bus->scl_pin, value);
|
||||
}
|
||||
|
||||
MR_INLINE void soft_i2c_bus_sda_set(struct mr_soft_i2c_bus *soft_i2c_bus, uint8_t value)
|
||||
{
|
||||
mr_dev_ioctl(soft_i2c_bus->desc, MR_CTL_PIN_SET_NUMBER, &soft_i2c_bus->sda_pin);
|
||||
mr_dev_write(soft_i2c_bus->desc, &value, sizeof(value));
|
||||
_mr_fast_pin_write(soft_i2c_bus->sda_pin, value);
|
||||
}
|
||||
|
||||
MR_INLINE uint8_t soft_i2c_sda_get(struct mr_soft_i2c_bus *soft_i2c_bus)
|
||||
{
|
||||
uint8_t value;
|
||||
|
||||
mr_dev_ioctl(soft_i2c_bus->desc, MR_CTL_PIN_SET_NUMBER, &soft_i2c_bus->sda_pin);
|
||||
mr_dev_read(soft_i2c_bus->desc, &value, sizeof(value));
|
||||
return value;
|
||||
return (uint8_t)_mr_fast_pin_read(soft_i2c_bus->sda_pin);
|
||||
}
|
||||
|
||||
static void soft_i2c_bus_wait_ack(struct mr_i2c_bus *i2c_bus)
|
||||
@@ -80,6 +77,7 @@ static int mr_soft_i2c_bus_configure(struct mr_i2c_bus *i2c_bus, struct mr_i2c_c
|
||||
{
|
||||
struct mr_soft_i2c_bus *soft_i2c_bus = (struct mr_soft_i2c_bus *)i2c_bus;
|
||||
int state = (config->baud_rate != 0) ? MR_ENABLE : MR_DISABLE;
|
||||
int mode = (state == MR_ENABLE) ? MR_PIN_MODE_OUTPUT_OD : MR_PIN_MODE_NONE;
|
||||
|
||||
if (state == MR_ENABLE)
|
||||
{
|
||||
@@ -91,58 +89,18 @@ static int mr_soft_i2c_bus_configure(struct mr_i2c_bus *i2c_bus, struct mr_i2c_c
|
||||
|
||||
/* Calculate the delay time */
|
||||
soft_i2c_bus->delay = (1000000 / config->baud_rate) / 2;
|
||||
}
|
||||
|
||||
/* Configure SCL and SDA */
|
||||
if (soft_i2c_bus->desc < 0)
|
||||
{
|
||||
soft_i2c_bus->desc = mr_dev_open("pin", MR_OFLAG_RDWR);
|
||||
if (soft_i2c_bus->desc < 0)
|
||||
{
|
||||
return soft_i2c_bus->desc;
|
||||
}
|
||||
|
||||
/* Configure SCL pin */
|
||||
mr_dev_ioctl(soft_i2c_bus->desc, MR_CTL_PIN_SET_NUMBER, &soft_i2c_bus->scl_pin);
|
||||
int ret = (int)mr_dev_ioctl(soft_i2c_bus->desc,
|
||||
MR_CTL_PIN_SET_MODE,
|
||||
MR_MAKE_LOCAL(int, MR_PIN_MODE_OUTPUT_OD));
|
||||
if (ret < 0)
|
||||
{
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Configure SDA pin */
|
||||
mr_dev_ioctl(soft_i2c_bus->desc, MR_CTL_PIN_SET_NUMBER, &soft_i2c_bus->sda_pin);
|
||||
ret = (int)mr_dev_ioctl(soft_i2c_bus->desc, MR_CTL_PIN_SET_MODE, MR_MAKE_LOCAL(int, MR_PIN_MODE_OUTPUT_OD));
|
||||
if (ret < 0)
|
||||
{
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
} else
|
||||
/* Configure SCL and SDA */
|
||||
int ret = _mr_fast_pin_mode(soft_i2c_bus->scl_pin, mode);
|
||||
if (ret < 0)
|
||||
{
|
||||
/* Reconfigure SCL and SDA */
|
||||
if (soft_i2c_bus->desc >= 0)
|
||||
{
|
||||
/* Reconfigure SCL pin */
|
||||
mr_dev_ioctl(soft_i2c_bus->desc, MR_CTL_PIN_SET_NUMBER, &soft_i2c_bus->scl_pin);
|
||||
int ret = (int)mr_dev_ioctl(soft_i2c_bus->desc, MR_CTL_PIN_SET_MODE, MR_MAKE_LOCAL(int, MR_PIN_MODE_NONE));
|
||||
if (ret < 0)
|
||||
{
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Reconfigure SDA pin */
|
||||
mr_dev_ioctl(soft_i2c_bus->desc, MR_CTL_PIN_SET_NUMBER, &soft_i2c_bus->sda_pin);
|
||||
ret = (int)mr_dev_ioctl(soft_i2c_bus->desc, MR_CTL_PIN_SET_MODE, MR_MAKE_LOCAL(int, MR_PIN_MODE_NONE));
|
||||
if (ret < 0)
|
||||
{
|
||||
return ret;
|
||||
}
|
||||
|
||||
mr_dev_close(soft_i2c_bus->desc);
|
||||
soft_i2c_bus->desc = -1;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
ret = _mr_fast_pin_mode(soft_i2c_bus->sda_pin, mode);
|
||||
if (ret < 0)
|
||||
{
|
||||
return ret;
|
||||
}
|
||||
return MR_EOK;
|
||||
}
|
||||
@@ -240,13 +198,13 @@ static void mr_soft_i2c_bus_write(struct mr_i2c_bus *i2c_bus, uint8_t data)
|
||||
* @brief This function registers a soft-i2c-bus.
|
||||
*
|
||||
* @param soft_i2c_bus The soft-i2c-bus.
|
||||
* @param name The name of the soft-i2c-bus.
|
||||
* @param path The path of the soft-i2c-bus.
|
||||
* @param scl_pin The scl pin of the soft-i2c-bus.
|
||||
* @param sda_pin The sda pin of the soft-i2c-bus.
|
||||
*
|
||||
* @return MR_EOK on success, otherwise an error code.
|
||||
* @return 0 on success, otherwise an error code.
|
||||
*/
|
||||
int mr_soft_i2c_bus_register(struct mr_soft_i2c_bus *soft_i2c_bus, const char *name, int scl_pin, int sda_pin)
|
||||
int mr_soft_i2c_bus_register(struct mr_soft_i2c_bus *soft_i2c_bus, const char *path, int scl_pin, int sda_pin)
|
||||
{
|
||||
static struct mr_i2c_bus_ops ops =
|
||||
{
|
||||
@@ -259,22 +217,20 @@ int mr_soft_i2c_bus_register(struct mr_soft_i2c_bus *soft_i2c_bus, const char *n
|
||||
};
|
||||
static struct mr_drv drv =
|
||||
{
|
||||
Mr_Drv_Type_I2C,
|
||||
&ops,
|
||||
MR_NULL
|
||||
};
|
||||
|
||||
MR_ASSERT(soft_i2c_bus != MR_NULL);
|
||||
MR_ASSERT(name != MR_NULL);
|
||||
MR_ASSERT(path != MR_NULL);
|
||||
|
||||
/* Initialize the fields */
|
||||
soft_i2c_bus->delay = 0;
|
||||
soft_i2c_bus->scl_pin = scl_pin;
|
||||
soft_i2c_bus->sda_pin = sda_pin;
|
||||
soft_i2c_bus->desc = -1;
|
||||
|
||||
/* Register the soft-i2c-bus */
|
||||
return mr_i2c_bus_register(&soft_i2c_bus->i2c_bus, name, &drv);
|
||||
return mr_i2c_bus_register(&soft_i2c_bus->i2c_bus, path, &drv);
|
||||
}
|
||||
|
||||
#endif /* defined(MR_USING_I2C) && defined(MR_USING_SOFT_I2C) */
|
||||
|
||||
Reference in New Issue
Block a user