From e2bfb94a7590323e3314a9742f59b7faa3a9b2ad Mon Sep 17 00:00:00 2001 From: zeroway Date: Fri, 30 Nov 2018 09:57:45 +0800 Subject: [PATCH] I2C : set/get chip data --- debug/i2c/Makefile | 14 ++++++++------ debug/i2c/myi2c.c | 42 +++++++++++++++++++++++++++--------------- debug/i2c/myi2c.dtsi | 7 +++++++ 3 files changed, 42 insertions(+), 21 deletions(-) create mode 100644 debug/i2c/myi2c.dtsi diff --git a/debug/i2c/Makefile b/debug/i2c/Makefile index 447a5fc..b3c143f 100644 --- a/debug/i2c/Makefile +++ b/debug/i2c/Makefile @@ -3,9 +3,9 @@ # DEBUG = y # Usage -# make CC= KERNELDIR= +# make CROSS_COMPILE= KERNEL_DIR= KERNEL_BUID_OUTPUT= # -# make CC=/home/zeroway/3288/src/3288_4.4/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin/arm-eabi-gcc KERNELDIR=/home/zeroway/3288/src/3288_4.4/kernel +# make CROSS_COMPILE=/home/zeroway/3288/51/src/3288_5.1_v2/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin/arm-eabi- KERNEL_DIR=/home/zeroway/3288/51/src/3288_5.1_v2/kernel KERNEL_BUID_OUTPUT=/home/zeroway/3288/51/src/3288_5.1_v2/out/target/product/rk3288/obj/KERNEL # Add your debugging flag (or not) to CFLAGS ifeq ($(DEBUG),y) @@ -15,13 +15,15 @@ DEBFLAGS = -O2 endif obj-m := myi2c.o -obj-m += i2c_regmap.o -KERNELDIR ?= /lib/modules/$(shell uname -r)/build -CC ?= gcc + +KERNEL_DIR ?= /lib/modules/$(shell uname -r)/build +KERNEL_BUID_OUTPUT ?=$(KERNEL_DIR) +CC = $(CROSS_COMPILE)gcc +LD = $(CROSS_COMPILE)ld PWD := $(shell pwd) modules: - $(MAKE) -C $(KERNELDIR) M=$(PWD) modules + $(MAKE) -C $(KERNEL_DIR) M=$(PWD) O=$(KERNEL_BUID_OUTPUT) modules clean: rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions modules.order Module.symvers diff --git a/debug/i2c/myi2c.c b/debug/i2c/myi2c.c index d598ee1..bfe2b51 100644 --- a/debug/i2c/myi2c.c +++ b/debug/i2c/myi2c.c @@ -4,20 +4,10 @@ #include #include -/* describe in device tree */ -#if 0 -&i2c { - myi2c@36 { - compatible = "myi2c"; - status = "okay"; - reg = <0x36>; - }; -} -#endif - struct myi2c_chip { + char name[20]; struct i2c_client *client; - struct device *dev; + struct device dev; }; static inline int __myi2c_read(struct i2c_client *client, @@ -32,6 +22,7 @@ static inline int __myi2c_read(struct i2c_client *client, } *val = (uint8_t)ret; + return 0; } @@ -65,8 +56,17 @@ static ssize_t myi2c_debug_show(struct device *dev, char *buf) { uint8_t val; - myi2c_read(dev,myi2c_regs_addr,&val); - return sprintf(buf,"REG[%x]=0x%x\n",myi2c_regs_addr,val); + struct i2c_client *client; + struct myi2c_chip *chip; + + /* get chip */ + client = container_of(dev, struct i2c_client, dev); + chip = i2c_get_clientdata(client); + printk("chip name = %s\n", chip->name); + + myi2c_read(dev, myi2c_regs_addr, &val); + + return sprintf(buf, "REG[%x]=0x%x\n", myi2c_regs_addr, val); } static ssize_t myi2c_debug_store(struct device *dev, @@ -74,11 +74,20 @@ static ssize_t myi2c_debug_store(struct device *dev, { int tmp; uint8_t val; + struct i2c_client *client; + struct myi2c_chip *chip; + + /* get chip */ + client = container_of(dev, struct i2c_client, dev); + chip = i2c_get_clientdata(client); + printk("chip name = %s\n", chip->name); + tmp = simple_strtoul(buf, NULL, 16); /* val = low 8 bit, addr = high 8 bit */ val = tmp & 0x00FF; myi2c_regs_addr= (tmp >> 8) & 0x00FF; myi2c_write(dev, myi2c_regs_addr, val); + return count; } @@ -119,7 +128,7 @@ static int myi2c_probe(struct i2c_client *client, } chip->client = client; - chip->dev = &client->dev; + strcpy(chip->name, "I2C_chip"); i2c_set_clientdata(client, chip); ret = sysfs_create_group(&client->dev.kobj, &myi2c_attr_group); @@ -135,6 +144,7 @@ static int myi2c_probe(struct i2c_client *client, static int myi2c_remove(struct i2c_client *client) { struct myi2c_chip *chip = i2c_get_clientdata(client); + sysfs_remove_group(&client->dev.kobj, &myi2c_attr_group); kfree(chip); @@ -160,7 +170,9 @@ static struct i2c_driver myi2c_driver = { static int myi2c_init(void) { int ret; + ret = i2c_add_driver(&myi2c_driver); + return ret; } diff --git a/debug/i2c/myi2c.dtsi b/debug/i2c/myi2c.dtsi new file mode 100644 index 0000000..6c76218 --- /dev/null +++ b/debug/i2c/myi2c.dtsi @@ -0,0 +1,7 @@ +&i2c0 { + myi2c@36 { + compatible = "myi2c"; + status = "okay"; + reg = <0x36>; + }; +};