From 0261e58a8b0e71caef99ed995b8b92a28a0fc3a1 Mon Sep 17 00:00:00 2001 From: baggio63446333 Date: Tue, 26 Jan 2021 12:38:12 +0900 Subject: [PATCH] boards: cxd56xx: Add I2C bitbang driver registration Add board API to register i2c bitbang driver as i2c device. --- boards/arm/cxd56xx/common/src/Make.defs | 4 + .../cxd56xx/common/src/cxd56_i2cdev_bitbang.c | 83 +++++++++++++++++++ .../cxd56xx/spresense/include/cxd56_i2cdev.h | 20 +++++ 3 files changed, 107 insertions(+) create mode 100644 boards/arm/cxd56xx/common/src/cxd56_i2cdev_bitbang.c diff --git a/boards/arm/cxd56xx/common/src/Make.defs b/boards/arm/cxd56xx/common/src/Make.defs index f54527e8ff..0895c22480 100644 --- a/boards/arm/cxd56xx/common/src/Make.defs +++ b/boards/arm/cxd56xx/common/src/Make.defs @@ -136,6 +136,10 @@ ifeq ($(CONFIG_CXD56_I2C_DRIVER),y) CSRCS += cxd56_i2cdev.c endif +ifeq ($(CONFIG_I2C_BITBANG),y) +CSRCS += cxd56_i2cdev_bitbang.c +endif + ifeq ($(CONFIG_CXD56_SPI_DRIVER),y) CSRCS += cxd56_spidev.c endif diff --git a/boards/arm/cxd56xx/common/src/cxd56_i2cdev_bitbang.c b/boards/arm/cxd56xx/common/src/cxd56_i2cdev_bitbang.c new file mode 100644 index 0000000000..1e101deb5f --- /dev/null +++ b/boards/arm/cxd56xx/common/src/cxd56_i2cdev_bitbang.c @@ -0,0 +1,83 @@ +/**************************************************************************** + * boards/arm/cxd56xx/common/src/cxd56_i2cdev_bitbang.c + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include + +#include +#include +#include + +#include "cxd56_i2c_bitbang.h" + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: board_i2cdev_bitbang_initialize + * + * Description: + * Initialize i2c bitbang driver and register as the /dev/i2c device. + * + * Input Parameters: + * sda_pin - The pin number used as I2C SDA signal + * scl_pin - The pin number used as I2C SCL signal + * + * Returned Value: + * OK on success; Negated errno on failure. + * + ****************************************************************************/ + +int board_i2cdev_bitbang_initialize(uint32_t sda_pin, uint32_t scl_pin) +{ + int ret = 0; + FAR struct i2c_master_s *i2c; + int port; + + /* Use a sda pin number as port number */ + + port = sda_pin; + + _info("Initializing /dev/i2c%d..\n", port); + + /* Initialize i2c bitbang device */ + + i2c = cxd56_i2c_bitbang_initialize(sda_pin, scl_pin); + if (!i2c) + { + _err("ERROR: Failed to initialize i2c%d.\n", port); + return -ENODEV; + } + +#ifdef CONFIG_I2C_DRIVER + ret = i2c_register(i2c, port); + if (ret < 0) + { + _err("ERROR: Failed to register i2c%d: %d\n", port, ret); + } +#endif + + return ret; +} diff --git a/boards/arm/cxd56xx/spresense/include/cxd56_i2cdev.h b/boards/arm/cxd56xx/spresense/include/cxd56_i2cdev.h index e5d200f42e..2f043dd041 100644 --- a/boards/arm/cxd56xx/spresense/include/cxd56_i2cdev.h +++ b/boards/arm/cxd56xx/spresense/include/cxd56_i2cdev.h @@ -26,6 +26,7 @@ ****************************************************************************/ #include +#include /**************************************************************************** * Public Types @@ -62,6 +63,25 @@ extern "C" int board_i2cdev_initialize(int bus); #endif +/**************************************************************************** + * Name: board_i2cdev_bitbang_initialize + * + * Description: + * Initialize i2c bitbang driver and register as the /dev/i2c device. + * + * Input Parameters: + * sda_pin - The pin number used as I2C SDA signal + * scl_pin - The pin number used as I2C SCL signal + * + * Returned Value: + * OK on success; Negated errno on failure. + * + ****************************************************************************/ + +#ifdef CONFIG_I2C_BITBANG +int board_i2cdev_bitbang_initialize(uint32_t sda_pin, uint32_t scl_pin); +#endif + #undef EXTERN #if defined(__cplusplus) }