mirror of
https://github.com/RT-Thread/rt-thread.git
synced 2026-05-16 11:38:11 +08:00
bsp: k230: add i2c driver
ToolsCI / Tools (push) Has been cancelled
RT-Thread BSP Static Build Check / 🔍 Summary of Git Diff Changes (push) Has been cancelled
RT-Thread BSP Static Build Check / ${{ matrix.legs.RTT_BSP }} (push) Has been cancelled
RT-Thread BSP Static Build Check / collect-artifacts (push) Has been cancelled
pkgs_test / change (push) Has been cancelled
utest_auto_run / A9 :components/dfs.cfg (push) Has been cancelled
utest_auto_run / A9 :components/lwip.cfg (push) Has been cancelled
utest_auto_run / A9 :components/netdev.cfg (push) Has been cancelled
utest_auto_run / A9 :components/sal.cfg (push) Has been cancelled
utest_auto_run / A9 :cpp11/cpp11.cfg (push) Has been cancelled
utest_auto_run / AARCH64-rtsmart :default.cfg (push) Has been cancelled
utest_auto_run / A9-rtsmart :default.cfg (push) Has been cancelled
utest_auto_run / RISCV-rtsmart :default.cfg (push) Has been cancelled
utest_auto_run / XUANTIE-rtsmart :default.cfg (push) Has been cancelled
utest_auto_run / AARCH64 :default.cfg (push) Has been cancelled
utest_auto_run / A9 :default.cfg (push) Has been cancelled
utest_auto_run / A9-smp :default.cfg (push) Has been cancelled
utest_auto_run / RISCV :default.cfg (push) Has been cancelled
utest_auto_run / A9 :kernel/atomic_c11.cfg (push) Has been cancelled
utest_auto_run / RISCV :kernel/atomic_c11.cfg (push) Has been cancelled
utest_auto_run / A9 :kernel/ipc.cfg (push) Has been cancelled
utest_auto_run / A9 :kernel/kernel_basic.cfg (push) Has been cancelled
utest_auto_run / A9 :kernel/mem.cfg (push) Has been cancelled
ToolsCI / Tools (push) Has been cancelled
RT-Thread BSP Static Build Check / 🔍 Summary of Git Diff Changes (push) Has been cancelled
RT-Thread BSP Static Build Check / ${{ matrix.legs.RTT_BSP }} (push) Has been cancelled
RT-Thread BSP Static Build Check / collect-artifacts (push) Has been cancelled
pkgs_test / change (push) Has been cancelled
utest_auto_run / A9 :components/dfs.cfg (push) Has been cancelled
utest_auto_run / A9 :components/lwip.cfg (push) Has been cancelled
utest_auto_run / A9 :components/netdev.cfg (push) Has been cancelled
utest_auto_run / A9 :components/sal.cfg (push) Has been cancelled
utest_auto_run / A9 :cpp11/cpp11.cfg (push) Has been cancelled
utest_auto_run / AARCH64-rtsmart :default.cfg (push) Has been cancelled
utest_auto_run / A9-rtsmart :default.cfg (push) Has been cancelled
utest_auto_run / RISCV-rtsmart :default.cfg (push) Has been cancelled
utest_auto_run / XUANTIE-rtsmart :default.cfg (push) Has been cancelled
utest_auto_run / AARCH64 :default.cfg (push) Has been cancelled
utest_auto_run / A9 :default.cfg (push) Has been cancelled
utest_auto_run / A9-smp :default.cfg (push) Has been cancelled
utest_auto_run / RISCV :default.cfg (push) Has been cancelled
utest_auto_run / A9 :kernel/atomic_c11.cfg (push) Has been cancelled
utest_auto_run / RISCV :kernel/atomic_c11.cfg (push) Has been cancelled
utest_auto_run / A9 :kernel/ipc.cfg (push) Has been cancelled
utest_auto_run / A9 :kernel/kernel_basic.cfg (push) Has been cancelled
utest_auto_run / A9 :kernel/mem.cfg (push) Has been cancelled
Requirement: The BSP for the k230 platform in the RT-Thread repository
does not yet have an I2C driver.
Solution: Provide I2C driver for the k230 platform in the RT-Thread
repository.
1. support i2c master mode
Signed-off-by: Ze-Hou <yingkezhou@qq.com>
This commit is contained in:
@@ -0,0 +1,9 @@
|
||||
scons.args: &scons
|
||||
scons_arg:
|
||||
- '--strict'
|
||||
devices.i2c:
|
||||
<<: *scons
|
||||
kconfig:
|
||||
- CONFIG_RT_USING_I2C=y
|
||||
- CONFIG_BSP_USING_I2C=y
|
||||
- CONFIG_BSP_USING_I2C0=y
|
||||
@@ -227,6 +227,7 @@ CONFIG_FINSH_THREAD_STACK_SIZE=8192
|
||||
CONFIG_FINSH_USING_HISTORY=y
|
||||
CONFIG_FINSH_HISTORY_LINES=5
|
||||
# CONFIG_FINSH_USING_WORD_OPERATION is not set
|
||||
# CONFIG_FINSH_USING_FUNC_EXT is not set
|
||||
CONFIG_FINSH_USING_SYMTAB=y
|
||||
CONFIG_FINSH_CMD_SIZE=80
|
||||
CONFIG_MSH_USING_BUILT_IN_COMMANDS=y
|
||||
@@ -425,6 +426,7 @@ CONFIG_RT_USING_POSIX_TIMER=y
|
||||
#
|
||||
CONFIG_RT_USING_SAL=y
|
||||
CONFIG_SAL_INTERNET_CHECK=y
|
||||
CONFIG_SOCKET_TABLE_STEP_LEN=4
|
||||
|
||||
#
|
||||
# Docking with protocol stacks
|
||||
@@ -1617,6 +1619,7 @@ CONFIG_PKG_ZLIB_VER="latest"
|
||||
#
|
||||
# Drivers Configuration
|
||||
#
|
||||
# CONFIG_BSP_USING_I2C is not set
|
||||
# CONFIG_BSP_USING_RTC is not set
|
||||
# CONFIG_BSP_USING_ADC is not set
|
||||
# CONFIG_BSP_USING_TS is not set
|
||||
|
||||
@@ -1,4 +1,31 @@
|
||||
menu "Drivers Configuration"
|
||||
menuconfig BSP_USING_I2C
|
||||
bool "Enable I2C"
|
||||
select RT_USING_I2C
|
||||
default n
|
||||
|
||||
if BSP_USING_I2C
|
||||
config BSP_USING_I2C0
|
||||
bool "Enable I2C0"
|
||||
default n
|
||||
|
||||
config BSP_USING_I2C1
|
||||
bool "Enable I2C1"
|
||||
default n
|
||||
|
||||
config BSP_USING_I2C2
|
||||
bool "Enable I2C2"
|
||||
default n
|
||||
|
||||
config BSP_USING_I2C3
|
||||
bool "Enable I2C3"
|
||||
default n
|
||||
|
||||
config BSP_USING_I2C4
|
||||
bool "Enable I2C4"
|
||||
default n
|
||||
|
||||
endif
|
||||
|
||||
config BSP_USING_RTC
|
||||
bool "Enable RTC"
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
# RT-Thread building script for I2C component
|
||||
|
||||
from building import *
|
||||
|
||||
cwd = GetCurrentDir()
|
||||
src = Glob('*.c')
|
||||
CPPPATH = [cwd]
|
||||
|
||||
group = DefineGroup('I2C', src, depend = ['BSP_USING_I2C'], CPPPATH = CPPPATH)
|
||||
|
||||
Return('group')
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -29,7 +29,10 @@ if GetDepend('BSP_UTEST_DRIVERS'):
|
||||
|
||||
if GetDepend('BSP_USING_RTC'):
|
||||
src += ['test_rtc.c']
|
||||
|
||||
|
||||
if GetDepend('BSP_USING_I2C'):
|
||||
src += ['test_i2c.c']
|
||||
|
||||
group = DefineGroup('utestcases', src, depend = [''])
|
||||
|
||||
Return('group')
|
||||
@@ -0,0 +1,204 @@
|
||||
/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2006-2025 RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
#include <rtthread.h>
|
||||
#include <rtdevice.h>
|
||||
#include <utest.h>
|
||||
#include <string.h>
|
||||
#include "drv_i2c.h"
|
||||
#include "drv_pinctrl.h"
|
||||
#include "drv_gpio.h"
|
||||
|
||||
/*
|
||||
* 测试K230 I2C的主从机通信,在这里采用I2C0作为测试对象
|
||||
*
|
||||
* 硬件平台:
|
||||
* 测试的硬件平台为庐山派开发板,使用的I2C0引脚是GPIO048(SCL)
|
||||
* 和GPIO049(SDA)。
|
||||
*
|
||||
* 测试说明:
|
||||
* 1. 测试I2C0主机模式
|
||||
* 主机模式下,主机向从机发送16字节数据(不包括写读地址),
|
||||
* 然后再读取回来进行校验,共执行两次,分别是400kHz和1MHz速率。
|
||||
* 注:使用的从机为AT24C08 EEPROM,设备地址为0x50。
|
||||
*/
|
||||
|
||||
#define I2C_NAME "i2c0"
|
||||
#define TARGET_ADDR 0x50
|
||||
|
||||
#define TEST_BUFFER_SIZE 16
|
||||
|
||||
#define I2C_SCL_PIN 48
|
||||
#define I2C_SDA_PIN 49
|
||||
#define I2C_SCL_PIN_AF IOMUX_FUNC4
|
||||
#define I2C_SDA_PIN_AF IOMUX_FUNC4
|
||||
|
||||
static void test_i2c0_deinit_pin(void)
|
||||
{
|
||||
k230_pinctrl_set_function(I2C_SCL_PIN, IOMUX_FUNC1);
|
||||
k230_pinctrl_set_function(I2C_SDA_PIN, IOMUX_FUNC1);
|
||||
k230_pinctrl_set_oe(I2C_SCL_PIN, 0);
|
||||
k230_pinctrl_set_oe(I2C_SDA_PIN, 0);
|
||||
k230_pinctrl_set_ie(I2C_SCL_PIN, 1);
|
||||
k230_pinctrl_set_ie(I2C_SDA_PIN, 1);
|
||||
|
||||
kd_pin_mode(I2C_SCL_PIN, GPIO_DM_INPUT);
|
||||
kd_pin_mode(I2C_SDA_PIN, GPIO_DM_INPUT);
|
||||
}
|
||||
|
||||
static void test_i2c0_init_pin(void)
|
||||
{
|
||||
k230_pinctrl_set_function(I2C_SCL_PIN, I2C_SCL_PIN_AF); // I2C0_SCL
|
||||
k230_pinctrl_set_function(I2C_SDA_PIN, I2C_SDA_PIN_AF); // I2C0_SDA
|
||||
k230_pinctrl_set_oe(I2C_SCL_PIN, 1);
|
||||
k230_pinctrl_set_oe(I2C_SDA_PIN, 1);
|
||||
k230_pinctrl_set_ie(I2C_SCL_PIN, 1);
|
||||
k230_pinctrl_set_ie(I2C_SDA_PIN, 1);
|
||||
}
|
||||
|
||||
static int test_i2c_check_pin(void)
|
||||
{
|
||||
test_i2c0_deinit_pin();
|
||||
|
||||
if(kd_pin_read(I2C_SCL_PIN) != 1 || kd_pin_read(I2C_SDA_PIN) != 1)
|
||||
{
|
||||
LOG_W("i2c bus is not idle, try to recover it.");
|
||||
k230_pinctrl_set_oe(I2C_SCL_PIN, 1);
|
||||
kd_pin_mode(I2C_SCL_PIN, GPIO_DM_OUTPUT);
|
||||
for(rt_uint8_t i = 0; i < 9; i++)
|
||||
{
|
||||
kd_pin_write(I2C_SCL_PIN, 0);
|
||||
rt_hw_us_delay(2);
|
||||
kd_pin_write(I2C_SCL_PIN, 1);
|
||||
rt_hw_us_delay(2);
|
||||
}
|
||||
k230_pinctrl_set_oe(I2C_SCL_PIN, 0);
|
||||
kd_pin_mode(I2C_SCL_PIN, GPIO_DM_INPUT);
|
||||
}
|
||||
|
||||
if(kd_pin_read(I2C_SCL_PIN) != 1 || kd_pin_read(I2C_SDA_PIN) != 1)
|
||||
{
|
||||
LOG_E("i2c bus recover failed");
|
||||
return -RT_ERROR;
|
||||
}
|
||||
|
||||
LOG_I("i2c bus(pin: %u, %u) is idle, init i2c bus pin", I2C_SCL_PIN, I2C_SDA_PIN);
|
||||
test_i2c0_init_pin();
|
||||
|
||||
return RT_EOK;
|
||||
}
|
||||
|
||||
static void _test_i2c0_master(rt_uint8_t *buffer_w, rt_uint8_t *buffer_r, rt_uint32_t size, rt_uint32_t speed)
|
||||
{
|
||||
rt_err_t ret = RT_EOK;
|
||||
struct rt_i2c_bus_device *dev;
|
||||
struct rt_i2c_msg msgs[2];
|
||||
|
||||
dev = rt_i2c_bus_device_find(I2C_NAME);
|
||||
uassert_not_null(dev);
|
||||
rt_i2c_control(dev, RT_I2C_DEV_CTRL_CLK, (void *)&speed);
|
||||
|
||||
msgs[0].addr = TARGET_ADDR;
|
||||
msgs[0].flags = RT_I2C_WR;
|
||||
msgs[0].buf = buffer_w;
|
||||
msgs[0].len = size + 1;
|
||||
|
||||
if(rt_i2c_transfer(dev, msgs, 1) != 1)
|
||||
{
|
||||
LOG_E("i2c transfer failed");
|
||||
uassert_true(0);
|
||||
}
|
||||
|
||||
rt_thread_mdelay(10);
|
||||
|
||||
msgs[0].addr = TARGET_ADDR;
|
||||
msgs[0].flags = RT_I2C_WR | RT_I2C_NO_STOP;
|
||||
msgs[0].buf = &buffer_r[0];
|
||||
msgs[0].len = 1;
|
||||
|
||||
msgs[1].addr = TARGET_ADDR;
|
||||
msgs[1].flags = RT_I2C_RD | RT_I2C_NO_START;
|
||||
msgs[1].buf = &buffer_r[1];
|
||||
msgs[1].len = size;
|
||||
|
||||
if(rt_i2c_transfer(dev, msgs, 2) != 2)
|
||||
{
|
||||
LOG_E("i2c transfer failed");
|
||||
uassert_true(0);
|
||||
}
|
||||
|
||||
LOG_I("Read data:\n");
|
||||
for(rt_uint8_t i = 1; i < size + 1; i++)
|
||||
{
|
||||
LOG_I("0x%02X ", buffer_r[i]);
|
||||
}
|
||||
uassert_buf_equal(buffer_w + 1, buffer_r + 1, size);
|
||||
}
|
||||
|
||||
static void test_i2c0_master(void)
|
||||
{
|
||||
rt_uint8_t buffer_w[TEST_BUFFER_SIZE + 1];
|
||||
rt_uint8_t buffer_r[TEST_BUFFER_SIZE + 1];
|
||||
rt_uint32_t size = TEST_BUFFER_SIZE;
|
||||
rt_uint32_t speed = 400000; // 400kHz
|
||||
|
||||
memset(buffer_w + 1, 0xAA, TEST_BUFFER_SIZE);
|
||||
buffer_w[0] = 0x00; // memory address
|
||||
memset(buffer_r, 0x00, TEST_BUFFER_SIZE + 1);
|
||||
|
||||
_test_i2c0_master(buffer_w, buffer_r, size, speed);
|
||||
|
||||
speed = 1000000; // 1MHz
|
||||
memset(buffer_w + 1, 0x55, TEST_BUFFER_SIZE);
|
||||
buffer_w[0] = 0x00; // memory address
|
||||
memset(buffer_r, 0x00, TEST_BUFFER_SIZE + 1);
|
||||
|
||||
_test_i2c0_master(buffer_w, buffer_r, size, speed);
|
||||
}
|
||||
|
||||
static void testcase(void)
|
||||
{
|
||||
LOG_I("This is a i2c test case.\n");
|
||||
UTEST_UNIT_RUN(test_i2c0_master);
|
||||
}
|
||||
|
||||
static rt_err_t utest_tc_init(void)
|
||||
{
|
||||
return test_i2c_check_pin();
|
||||
}
|
||||
|
||||
static rt_err_t utest_tc_cleanup(void)
|
||||
{
|
||||
LOG_I("i2c bus pin deinit.\n");
|
||||
test_i2c0_deinit_pin();
|
||||
return RT_EOK;
|
||||
}
|
||||
UTEST_TC_EXPORT(testcase, "bsp.k230.drivers.i2c", utest_tc_init, utest_tc_cleanup, 100);
|
||||
@@ -276,6 +276,7 @@
|
||||
|
||||
#define RT_USING_SAL
|
||||
#define SAL_INTERNET_CHECK
|
||||
#define SOCKET_TABLE_STEP_LEN 4
|
||||
|
||||
/* Docking with protocol stacks */
|
||||
|
||||
|
||||
Reference in New Issue
Block a user