mirror of
https://gitee.com/Vancouver2017/luban-lite-t3e-pro.git
synced 2025-12-16 03:18:54 +00:00
v1.1.1
This commit is contained in:
@@ -2,6 +2,25 @@
|
||||
# i2c devices local parameter
|
||||
#-----------------------------
|
||||
|
||||
# soft_i2c parameter
|
||||
|
||||
menu "SOFT_I2C Parameter"
|
||||
depends on AIC_USING_SOFT_I2C
|
||||
|
||||
config AIC_SOFT_I2C_SCL_PIN
|
||||
string "SOFT_I2C SCL PIN"
|
||||
default "PD.6"
|
||||
|
||||
config AIC_SOFT_I2C_SDA_PIN
|
||||
string "SOFT_I2C SDA PIN"
|
||||
default "PD.7"
|
||||
|
||||
config AIC_DEV_SOFT_I2C_DELAY_TIME
|
||||
int "Setting SOFT_I2C GPIO Level Change Delay Time(us)"
|
||||
default 5
|
||||
|
||||
endmenu
|
||||
|
||||
# i2c0 parameter
|
||||
|
||||
menu "I2C0 Parameter"
|
||||
|
||||
@@ -117,17 +117,24 @@ struct aic_i2c_bus {
|
||||
struct rt_completion cmd_complete;
|
||||
};
|
||||
|
||||
static struct aic_i2c_bus g_aic_i2c_dev[AIC_I2C_CH_NUM];
|
||||
static struct aic_i2c_bus g_aic_i2c_dev[I2C_MAX_CHAN];
|
||||
|
||||
irqreturn_t aic_i2c_slave_irqhandler(int irq, void * data)
|
||||
{
|
||||
int index = irq - I2C0_IRQn;
|
||||
int i, index = 0;
|
||||
uint32_t intr_stat;
|
||||
uint8_t val;
|
||||
uint8_t fifo_num;
|
||||
struct slave_param parm;
|
||||
aic_i2c_ctrl *i2c_dev;
|
||||
|
||||
for (i = 0; i < I2C_MAX_CHAN; i++) {
|
||||
if (irq == g_aic_i2c_dev[i].aic_bus.irq_index) {
|
||||
index = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
i2c_dev = &g_aic_i2c_dev[index].aic_bus;
|
||||
intr_stat = hal_i2c_get_raw_interrupt_state(i2c_dev);
|
||||
fifo_num = hal_i2c_get_receive_fifo_num(i2c_dev);
|
||||
@@ -280,10 +287,17 @@ static void aic_i2c_handle_write(struct aic_i2c_ctrl *i2c_dev)
|
||||
|
||||
irqreturn_t aic_i2c_irqhandler(int irq, void * data)
|
||||
{
|
||||
int index = irq - I2C0_IRQn;
|
||||
int i, index = 0;
|
||||
uint32_t status = 0;
|
||||
aic_i2c_ctrl *i2c_dev;
|
||||
|
||||
for (i = 0; i < I2C_MAX_CHAN; i++) {
|
||||
if (irq == g_aic_i2c_dev[i].aic_bus.irq_index) {
|
||||
index = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
i2c_dev = &g_aic_i2c_dev[index].aic_bus;
|
||||
status = hal_i2c_get_raw_interrupt_state(i2c_dev);
|
||||
/* clear all interrupt flags */
|
||||
@@ -386,7 +400,7 @@ static rt_size_t aic_i2c_master_xfer(struct rt_i2c_bus_device *bus,
|
||||
}
|
||||
hal_i2c_module_disable(i2c_dev);
|
||||
|
||||
return (ret < 0) ? ret : num;
|
||||
return (ret < 0) ? 0 : num;
|
||||
}
|
||||
#else
|
||||
static rt_size_t aic_i2c_master_xfer(struct rt_i2c_bus_device *bus,
|
||||
|
||||
102
bsp/artinchip/drv/i2c/drv_soft_i2c.c
Normal file
102
bsp/artinchip/drv/i2c/drv_soft_i2c.c
Normal file
@@ -0,0 +1,102 @@
|
||||
/*
|
||||
* Copyright (c) 2024, ArtInChip Technology Co., Ltd
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Authors: hjh <jiehua.huang@artinchip.com>
|
||||
*/
|
||||
#include <rtthread.h>
|
||||
#include <rtdevice.h>
|
||||
#include <aic_core.h>
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <drivers/i2c-bit-ops.h>
|
||||
#include "aic_hal_clk.h"
|
||||
#include "aic_common.h"
|
||||
#include "aic_log.h"
|
||||
|
||||
#define AIC_SOFT_I2C_TIMEOUT 1000
|
||||
|
||||
struct aic_soft_i2c_pin {
|
||||
u32 sda_pin;
|
||||
u32 scl_pin;
|
||||
};
|
||||
|
||||
struct aic_soft_i2c_bus {
|
||||
struct rt_i2c_bus_device bus;
|
||||
struct aic_soft_i2c_pin aic_i2c_pin;
|
||||
};
|
||||
|
||||
static struct aic_soft_i2c_bus g_aic_soft_i2c;
|
||||
|
||||
static void aic_soft_i2c_set_sda(void *data, rt_int32_t state)
|
||||
{
|
||||
rt_pin_mode(g_aic_soft_i2c.aic_i2c_pin.sda_pin, PIN_MODE_OUTPUT);
|
||||
rt_pin_write(g_aic_soft_i2c.aic_i2c_pin.sda_pin, state);
|
||||
}
|
||||
|
||||
static void aic_soft_i2c_set_scl(void *data, rt_int32_t state)
|
||||
{
|
||||
rt_pin_mode(g_aic_soft_i2c.aic_i2c_pin.scl_pin, PIN_MODE_OUTPUT);
|
||||
rt_pin_write(g_aic_soft_i2c.aic_i2c_pin.scl_pin, state);
|
||||
}
|
||||
|
||||
static rt_int32_t aic_soft_i2c_get_sda(void *data)
|
||||
{
|
||||
rt_int32_t ret;
|
||||
|
||||
rt_pin_mode(g_aic_soft_i2c.aic_i2c_pin.sda_pin, PIN_MODE_INPUT_PULLUP);
|
||||
ret = rt_pin_read(g_aic_soft_i2c.aic_i2c_pin.sda_pin);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static rt_int32_t aic_soft_i2c_get_scl(void *data)
|
||||
{
|
||||
rt_int32_t ret;
|
||||
|
||||
rt_pin_mode(g_aic_soft_i2c.aic_i2c_pin.scl_pin, PIN_MODE_INPUT_PULLUP);
|
||||
ret = rt_pin_read(g_aic_soft_i2c.aic_i2c_pin.scl_pin);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void aic_soft_i2c_udelay(rt_uint32_t us)
|
||||
{
|
||||
aic_udelay(us);
|
||||
}
|
||||
|
||||
struct rt_i2c_bit_ops aic_soft_i2c_ops = {
|
||||
.data = NULL,
|
||||
.set_sda = aic_soft_i2c_set_sda,
|
||||
.set_scl = aic_soft_i2c_set_scl,
|
||||
.get_sda = aic_soft_i2c_get_sda,
|
||||
.get_scl = aic_soft_i2c_get_scl,
|
||||
.udelay = aic_soft_i2c_udelay,
|
||||
#ifdef AIC_USING_SOFT_I2C
|
||||
.delay_us = AIC_DEV_SOFT_I2C_DELAY_TIME,
|
||||
#endif
|
||||
.timeout = AIC_SOFT_I2C_TIMEOUT,
|
||||
};
|
||||
|
||||
static int aic_soft_i2c_register()
|
||||
{
|
||||
int ret = RT_EOK;
|
||||
|
||||
#ifdef AIC_USING_SOFT_I2C
|
||||
g_aic_soft_i2c.aic_i2c_pin.sda_pin = rt_pin_get(AIC_SOFT_I2C_SDA_PIN);
|
||||
g_aic_soft_i2c.aic_i2c_pin.scl_pin = rt_pin_get(AIC_SOFT_I2C_SCL_PIN);
|
||||
|
||||
g_aic_soft_i2c.bus.priv = &aic_soft_i2c_ops;
|
||||
|
||||
ret = rt_i2c_bit_add_bus(&g_aic_soft_i2c.bus, "soft_i2c");
|
||||
if (ret) {
|
||||
hal_log_err("register soft i2c fail\r\n");
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
INIT_DEVICE_EXPORT(aic_soft_i2c_register);
|
||||
Reference in New Issue
Block a user