From 15ade055295d13f95d49e3d99b09f3bbfb4a43e7 Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Mon, 06 Nov 2023 07:25:24 +0000
Subject: [PATCH] add at24 driver
---
kernel/arch/arm64/configs/rockchip_linux_defconfig | 6 +-
kernel/drivers/misc/Makefile | 1
kernel/drivers/misc/eeprom/at24.c | 148 +++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 151 insertions(+), 4 deletions(-)
diff --git a/kernel/arch/arm64/configs/rockchip_linux_defconfig b/kernel/arch/arm64/configs/rockchip_linux_defconfig
index 2efcace..ff8d54f 100644
--- a/kernel/arch/arm64/configs/rockchip_linux_defconfig
+++ b/kernel/arch/arm64/configs/rockchip_linux_defconfig
@@ -4,10 +4,10 @@
#
#
-# Compiler: aarch64-none-linux-gnu-gcc (GNU Toolchain for the A-profile Architecture 10.3-2021.07 (arm-10.29)) 10.3.1 20210621
+# Compiler: aarch64-linux-gnu-gcc (Linaro GCC 6.3-2017.05) 6.3.1 20170404
#
CONFIG_CC_IS_GCC=y
-CONFIG_GCC_VERSION=100301
+CONFIG_GCC_VERSION=60301
CONFIG_CLANG_VERSION=0
CONFIG_LLD_VERSION=0
CONFIG_CC_HAS_ASM_GOTO=y
@@ -1311,7 +1311,7 @@
#
# EEPROM support
#
-# CONFIG_EEPROM_AT24 is not set
+CONFIG_EEPROM_AT24=y
# CONFIG_EEPROM_AT25 is not set
# CONFIG_EEPROM_LEGACY is not set
# CONFIG_EEPROM_MAX6875 is not set
diff --git a/kernel/drivers/misc/Makefile b/kernel/drivers/misc/Makefile
index 6f30411..313d46c 100644
--- a/kernel/drivers/misc/Makefile
+++ b/kernel/drivers/misc/Makefile
@@ -63,3 +63,4 @@
obj-$(CONFIG_PIR_ASCHIP) += pir-aschip.o
obj-$(CONFIG_RK803) += rk803.o
obj-y += nkio/
+obj-y += nkmcu/
diff --git a/kernel/drivers/misc/eeprom/at24.c b/kernel/drivers/misc/eeprom/at24.c
index dc35376..dde0b45 100644
--- a/kernel/drivers/misc/eeprom/at24.c
+++ b/kernel/drivers/misc/eeprom/at24.c
@@ -6,6 +6,7 @@
* Copyright (C) 2008 Wolfram Sang, Pengutronix
*/
+#define DEBUG
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
@@ -106,6 +107,8 @@
module_param_named(write_timeout, at24_write_timeout, uint, 0);
MODULE_PARM_DESC(at24_write_timeout, "Time (in ms) to try writes (default 25)");
+//Ben
+struct at24_data *at24_private=NULL;
struct at24_chip_data {
/*
* these fields mirror their equivalents in
@@ -421,6 +424,146 @@
return 0;
}
+//add ben
+static ssize_t at24_read_private(struct at24_data *at24,
+ char *buf, loff_t off, size_t count)
+{
+ ssize_t retval = 0;
+
+ if (unlikely(!count))
+ return count;
+
+ if (off + count > at24->byte_len)
+ return -EINVAL;
+
+ /*
+ * Read data from chip, protecting against concurrent updates
+ * from this host, but not from other I2C masters.
+ */
+ mutex_lock(&at24->lock);
+
+ while (count) {
+ ssize_t status;
+
+ //status = at24_eeprom_read_i2c(at24, buf, off, count);
+ status = at24_regmap_read(at24, buf, off, count);
+ if (status <= 0) {
+ if (retval == 0)
+ retval = status;
+ break;
+ }
+ buf += status;
+ off += status;
+ count -= status;
+ retval += status;
+ }
+
+ mutex_unlock(&at24->lock);
+
+ return retval;
+}
+
+#if 0
+static unsigned char AscToHex(unsigned char aChar)
+{
+ if((aChar>=0x30)&&(aChar<=0x39))
+ aChar -= 0x30;
+ else if((aChar>=0x41)&&(aChar<=0x46))
+ aChar -= 0x37;
+ else if((aChar>=0x61)&&(aChar<=0x66))
+ aChar -= 0x57;
+ else aChar = 0xff;
+
+ return aChar;
+}
+#endif
+
+#if 0
+ssize_t at24_mac_read(unsigned char* addr)
+{
+ char buf[20];
+ char buf_tmp[12];
+ int i;
+ ssize_t ret;
+ if (at24_private == NULL)
+ {
+ printk("ben %s: at24_private==null error\n", __func__);
+ return 0;
+ }
+ memset(buf, 0x00, 20);
+ memset(buf_tmp, 0x00, 12);
+ ret = at24_read(at24_private, 0, buf, 12);
+ if (ret > 0)
+ {
+ for(i=0; i<12; i++)
+ {
+ buf_tmp[i] = AscToHex(buf[i]);
+ }
+ addr[0] = (buf_tmp[0] << 4) | buf_tmp[1];
+ addr[1] = (buf_tmp[2] << 4) | buf_tmp[3];
+ addr[2] = (buf_tmp[4] << 4) | buf_tmp[5];
+ addr[3] = (buf_tmp[6] << 4) | buf_tmp[7];
+ addr[4] = (buf_tmp[8] << 4) | buf_tmp[9];
+ addr[5] = (buf_tmp[10] << 4) | buf_tmp[11];
+ }
+ return ret;
+}
+#endif
+
+ssize_t at24_mac_read(unsigned char* addr)
+{
+ char buf[20];
+ char buf_tmp[12];
+ ssize_t ret;
+ if (at24_private == NULL)
+ {
+ printk("ben: at24_mac_read at24_private==null error");
+ return 0;
+ }
+ memset(buf, 0x00, 20);
+ memset(buf_tmp, 0x00, 12);
+ ret = at24_read_private(at24_private, buf, 0, 6);
+ if (ret > 0)
+ {
+ addr[0] = buf[0];
+ addr[1] = buf[1];
+ addr[2] = buf[2];
+ addr[3] = buf[3];
+ addr[4] = buf[4];
+ addr[5] = buf[5];
+ }
+ printk("at24_mac_read ...............\n");
+ return ret;
+}
+EXPORT_SYMBOL(at24_mac_read);
+
+ssize_t at24_mac1_read(unsigned char* mac)
+{
+ char buf[20];
+ char buf_tmp[12];
+ ssize_t ret;
+ if (at24_private == NULL)
+ {
+ printk("zcl: at24_mac_read at24_private==null error");
+ return 0;
+ }
+ memset(buf, 0x00, 20);
+ memset(buf_tmp, 0x00, 12);
+ ret = at24_read_private(at24_private, buf, 0x10, 6);
+ if (ret > 0)
+ {
+ *mac = buf[0];
+ *(mac + 1) = buf[1];
+ *(mac + 2) = buf[2];
+ *(mac + 3) = buf[3];
+ *(mac + 4) = buf[4];
+ *(mac + 5) = buf[5];
+ }
+ printk("at24_mac1_read ...............\n");
+ return ret;
+}
+EXPORT_SYMBOL(at24_mac1_read);
+
static int at24_write(void *priv, unsigned int off, void *val, size_t count)
{
struct at24_data *at24;
@@ -630,6 +773,7 @@
u8 test_byte;
int err;
+ printk("ben %s ...\n", __func__);
i2c_fn_i2c = i2c_check_functionality(client->adapter, I2C_FUNC_I2C);
i2c_fn_block = i2c_check_functionality(client->adapter,
I2C_FUNC_SMBUS_WRITE_I2C_BLOCK);
@@ -674,6 +818,7 @@
if (!at24)
return -ENOMEM;
+ at24_private = at24;
mutex_init(&at24->lock);
at24->byte_len = pdata.byte_len;
at24->page_size = pdata.page_size;
@@ -792,7 +937,8 @@
at24_io_limit = rounddown_pow_of_two(at24_io_limit);
return i2c_add_driver(&at24_driver);
}
-module_init(at24_init);
+//module_init(at24_init);
+postcore_initcall_sync(at24_init);
static void __exit at24_exit(void)
{
--
Gitblit v1.6.2