mirror of https://github.com/OpenIPC/firmware.git
				
				
				
			t31-t40 drivers moved to opensdk (#841)
							parent
							
								
									b975e2f1d2
								
							
						
					
					
						commit
						b583d80644
					
				|  | @ -58,6 +58,7 @@ BR2_PACKAGE_BUSYBOX_CONFIG="$(BR2_EXTERNAL)/package/busybox/busybox.config" | |||
| BR2_PACKAGE_DROPBEAR_OPENIPC=y | ||||
| # BR2_PACKAGE_FDK_AAC_OPENIPC is not set | ||||
| BR2_PACKAGE_UBOOT_TOOLS=y | ||||
| BR2_PACKAGE_INGENIC_OPENSDK=y | ||||
| BR2_PACKAGE_INGENIC_OSDRV_T31=y | ||||
| # BR2_PACKAGE_HASERL is not set | ||||
| # BR2_PACKAGE_HISI_GPIO is not set | ||||
|  |  | |||
|  | @ -58,6 +58,7 @@ BR2_PACKAGE_BUSYBOX_CONFIG="$(BR2_EXTERNAL)/package/busybox/busybox.config" | |||
| BR2_PACKAGE_DROPBEAR_OPENIPC=y | ||||
| # BR2_PACKAGE_FDK_AAC_OPENIPC is not set | ||||
| BR2_PACKAGE_UBOOT_TOOLS=y | ||||
| BR2_PACKAGE_INGENIC_OPENSDK=y | ||||
| BR2_PACKAGE_INGENIC_OSDRV_T31=y | ||||
| BR2_PACKAGE_HASERL=y | ||||
| # BR2_PACKAGE_HISI_GPIO is not set | ||||
|  |  | |||
|  | @ -58,6 +58,7 @@ BR2_PACKAGE_BUSYBOX_CONFIG="$(BR2_EXTERNAL)/package/busybox/busybox.config" | |||
| BR2_PACKAGE_DROPBEAR_OPENIPC=y | ||||
| # BR2_PACKAGE_FDK_AAC_OPENIPC is not set | ||||
| BR2_PACKAGE_UBOOT_TOOLS=y | ||||
| BR2_PACKAGE_INGENIC_OPENSDK=y | ||||
| BR2_PACKAGE_INGENIC_OSDRV_T31=y | ||||
| BR2_PACKAGE_HASERL=y | ||||
| # BR2_PACKAGE_HISI_GPIO is not set | ||||
|  |  | |||
|  | @ -58,6 +58,7 @@ BR2_PACKAGE_BUSYBOX_CONFIG="$(BR2_EXTERNAL)/package/busybox/busybox.config" | |||
| BR2_PACKAGE_DROPBEAR_OPENIPC=y | ||||
| # BR2_PACKAGE_FDK_AAC_OPENIPC is not set | ||||
| BR2_PACKAGE_UBOOT_TOOLS=y | ||||
| BR2_PACKAGE_INGENIC_OPENSDK=y | ||||
| BR2_PACKAGE_INGENIC_OSDRV_T40=y | ||||
| BR2_PACKAGE_HASERL=y | ||||
| # BR2_PACKAGE_HISI_GPIO is not set | ||||
|  |  | |||
|  | @ -58,6 +58,7 @@ BR2_PACKAGE_BUSYBOX_CONFIG="$(BR2_EXTERNAL)/package/busybox/busybox.config" | |||
| BR2_PACKAGE_DROPBEAR_OPENIPC=y | ||||
| # BR2_PACKAGE_FDK_AAC_OPENIPC is not set | ||||
| BR2_PACKAGE_UBOOT_TOOLS=y | ||||
| BR2_PACKAGE_INGENIC_OPENSDK=y | ||||
| BR2_PACKAGE_INGENIC_OSDRV_T40=y | ||||
| BR2_PACKAGE_HASERL=y | ||||
| # BR2_PACKAGE_HISI_GPIO is not set | ||||
|  |  | |||
|  | @ -4,17 +4,14 @@ | |||
| #
 | ||||
| ################################################################################
 | ||||
| 
 | ||||
| INGENIC_OPENSDK_VERSION = $(shell git ls-remote https://github.com/OpenIPC/openingenic master | awk '{ print $$1 }') | ||||
| INGENIC_OPENSDK_SITE = $(call github,openipc,openingenic,$(INGENIC_OPENSDK_VERSION)) | ||||
| INGENIC_OPENSDK_LICENSE = GPL-3.0 | ||||
| INGENIC_OPENSDK_LICENSE_FILES = LICENSE | ||||
| 
 | ||||
| define INGENIC_OPENSDK_EXTRACT_CMDS | ||||
| 	cp $(INGENIC_OPENSDK_PKGDIR)/src/kernel/* $(@D)/ | ||||
| endef | ||||
| 
 | ||||
| INGENIC_OPENSDK_MODULE_SUBDIRS = kernel | ||||
| INGENIC_OPENSDK_MODULE_MAKE_OPTS = \
 | ||||
| 	CONFIG_GPIO=m \
 | ||||
| 	KVER=$(LINUX_VERSION_PROBED) \
 | ||||
| 	KSRC=$(LINUX_DIR) | ||||
| 	SOC=$(OPENIPC_MODEL) | ||||
| 
 | ||||
| $(eval $(kernel-module)) | ||||
| $(eval $(generic-package)) | ||||
|  |  | |||
|  | @ -1,20 +0,0 @@ | |||
| CROSS_COMPILE ?= mips-linux-gnu- | ||||
| 
 | ||||
| ifeq (${ISVP_ENV_KERNEL_DIR}, ) | ||||
| 	ISVP_ENV_KERNEL_DIR = ../../../kernel | ||||
| endif | ||||
| 
 | ||||
| KDIR := ${ISVP_ENV_KERNEL_DIR} | ||||
| MODULE_NAME := gpio | ||||
| 
 | ||||
| all: modules | ||||
| 
 | ||||
| .PHONY: modules clean | ||||
| 
 | ||||
| obj-m := $(MODULE_NAME).o | ||||
| 
 | ||||
| modules: | ||||
| 	@$(MAKE) -C $(KDIR) M=$(shell pwd) $@ | ||||
| clean: | ||||
| 	@rm -rf *.o *~ .depend .*.cmd  *.mod.c .tmp_versions *.ko *.symvers modules.order | ||||
| 	@rm -f gpio | ||||
|  | @ -1,79 +0,0 @@ | |||
| #include <jz_proc.h> | ||||
| #include <linux/proc_fs.h> | ||||
| #include <linux/gpio.h> | ||||
| #include <linux/init.h> | ||||
| #include <linux/kernel.h> | ||||
| #include <linux/module.h> | ||||
| #include <linux/types.h> | ||||
| 
 | ||||
| 
 | ||||
| MODULE_LICENSE("GPL"); | ||||
| MODULE_AUTHOR("OpenIPC"); | ||||
| MODULE_DESCRIPTION("Ingenic GPIO Claimer"); | ||||
| 
 | ||||
| static struct proc_dir_entry *claim_proc; | ||||
| 
 | ||||
| int claim_gpio(int gpio) { | ||||
|   int ret = 0; | ||||
| 
 | ||||
|   pr_debug("GPIO[%i] Requesting...\n", gpio); | ||||
| 
 | ||||
|   if (!gpio_is_valid(gpio)) { | ||||
|     pr_err("GPIO[%i] is not valid\n", gpio); | ||||
|     return -1; | ||||
|   } | ||||
| 
 | ||||
|   if (gpio_request(gpio, 0) > 0) | ||||
|     return -1; | ||||
| 
 | ||||
|   pr_debug("GPIO[%i] Setting direction...\n", gpio); | ||||
|   gpio_direction_output(gpio, 0); | ||||
|   pr_debug("GPIO[%i] Exporting...\n", gpio); | ||||
|   gpio_export(gpio, true); | ||||
| 
 | ||||
|   return 0; | ||||
| } | ||||
| 
 | ||||
| ssize_t claim_proc_write(struct file *filp, const char *buf, size_t len, | ||||
|                          loff_t *off) { | ||||
|   int ret = 0; | ||||
|   char cmd[4] = {0}; | ||||
|   uint32_t addr, data, datalen; | ||||
| 
 | ||||
|   if (len > 4) { | ||||
|     return -EFAULT; | ||||
|   } | ||||
|   if (copy_from_user(cmd, buf, len)) { | ||||
|     return -EFAULT; | ||||
|   } | ||||
|   int gpio = simple_strtoul(cmd, NULL, 0); | ||||
|   ret = claim_gpio(gpio); | ||||
|   if (ret) { | ||||
|     pr_err("GPIO[%i] Error %i \n", gpio, ret); | ||||
|     return -EFAULT; | ||||
|   } else { | ||||
|     pr_debug("GPIO[%i] Claiming...\n", gpio); | ||||
|   } | ||||
| 
 | ||||
|   return len; | ||||
| } | ||||
| 
 | ||||
| static const struct file_operations claim_proc_fops = { | ||||
|     .owner = THIS_MODULE, | ||||
|     .write = claim_proc_write, | ||||
| }; | ||||
| 
 | ||||
| static __init int init_claim(void) { | ||||
|   claim_proc = proc_mkdir("jz/claim", 0); | ||||
|   if (!claim_proc) { | ||||
|     printk("err: jz_proc_mkdir failed\n"); | ||||
|   } | ||||
|   proc_create_data("gpio", S_IRUGO, claim_proc, &claim_proc_fops, NULL); | ||||
|   printk("Ingenic GPIO claim module (c) OpenIPC.org\n"); | ||||
|   return 0; | ||||
| } | ||||
| 
 | ||||
| static __exit void exit_claim(void) { proc_remove(claim_proc); } | ||||
| 
 | ||||
| module_init(init_claim); | ||||
| module_exit(exit_claim); | ||||
|  | @ -1,25 +0,0 @@ | |||
| CROSS_COMPILE ?= mips-linux-gnu- | ||||
| 
 | ||||
| KDIR := ${ISVP_ENV_KERNEL_DIR} | ||||
| MODULE_NAME := sinfo | ||||
| 
 | ||||
| all: modules | ||||
| 
 | ||||
| .PHONY: modules clean | ||||
| 
 | ||||
| $(MODULE_NAME)-objs := sensor_info.o | ||||
| obj-m := $(MODULE_NAME).o | ||||
| 
 | ||||
| modules: | ||||
| 	@if test "$(KDIR)" = ""; \
 | ||||
| 	then \
 | ||||
| 		echo "**************************************"; \
 | ||||
| 		echo "Please run env_setup.sh at top of isvp"; \
 | ||||
| 		echo "**************************************"; \
 | ||||
| 	fi | ||||
| 	@$(MAKE) -C $(KDIR) M=$(shell pwd) $@ | ||||
| sample_sinfo: | ||||
| 	mips-linux-gnu-gcc sample_sinfo.c -o sample_sinfo | ||||
| clean: | ||||
| 	@rm -rf *.o *~ .depend .*.cmd  *.mod.c .tmp_versions *.ko *.symvers modules.order | ||||
| 	@rm -f sample_sinfo | ||||
|  | @ -1,5 +0,0 @@ | |||
| Two ways to get sensor info | ||||
| 
 | ||||
| 1. open /dev/sinfo; ioctl TOCTL_SINFO_GET | ||||
| 
 | ||||
| 2. echo 1 >/proc/jz/sinfo/info; cat /proc/jz/sinfo/info | ||||
|  | @ -1,148 +0,0 @@ | |||
| /*
 | ||||
|  * sample_sinfo.c | ||||
|  * | ||||
|  * two ways to get sensor info | ||||
|  * | ||||
|  * 1. open /dev/sinfo; ioctl TOCTL_SINFO_GET | ||||
|  * | ||||
|  * 2. echo 1 >/proc/jz/sinfo/info; cat /proc/jz/sinfo/info | ||||
|  * | ||||
|  * */ | ||||
| #include <stdio.h> | ||||
| #include <string.h> | ||||
| #include <stdlib.h> | ||||
| #include <errno.h> | ||||
| #include <fcntl.h> | ||||
| #include <unistd.h> | ||||
| #include <sys/types.h> | ||||
| #include <sys/ioctl.h> | ||||
| 
 | ||||
| #define SENSOR_INFO_IOC_MAGIC  'S' | ||||
| #define IOCTL_SINFO_GET			_IO(SENSOR_INFO_IOC_MAGIC, 100) | ||||
| #define IOCTL_SINFO_FLASH		_IO(SENSOR_INFO_IOC_MAGIC, 101) | ||||
| 
 | ||||
| #define SENSOR_TYPE_INVALID	-1 | ||||
| 
 | ||||
| typedef struct SENSOR_INFO_S | ||||
| { | ||||
| 	unsigned char *name; | ||||
| } SENSOR_INFO_T; | ||||
| 
 | ||||
| SENSOR_INFO_T g_sinfo[] = | ||||
| { | ||||
| 	{"ov9712"}, | ||||
| 	{"ov9732"}, | ||||
| 	{"ov9750"}, | ||||
| 	{"jxh42"}, | ||||
| 	{"sc1035"}, | ||||
| 	{"sc1135"}, | ||||
| 	{"sc1045"}, | ||||
| 	{"sc1145"}, | ||||
| 	{"ar0130"}, | ||||
| 	{"jxh61"}, | ||||
| 	{"gc2083"}, | ||||
| 	{"gc1024"}, | ||||
| 	{"gc1064"}, | ||||
| 	{"gc2023"}, | ||||
| 	{"bf3115"}, | ||||
| 	{"imx225"}, | ||||
| 	{"ov2710"}, | ||||
| 	{"imx323"}, | ||||
| 	{"sc2135"}, | ||||
| 	{"sp1409"}, | ||||
| 	{"jxh62"}, | ||||
| 	{"bg0806"}, | ||||
| 	{"ov4689"}, | ||||
| 	{"jxf22"}, | ||||
| 	{"imx322"}, | ||||
| 	{"imx307"}, | ||||
| 	{"imx291"}, | ||||
| 	{"ov2735"}, | ||||
| 	{"sc3035"}, | ||||
| 	{"ar0237"}, | ||||
| 	{"sc2145"}, | ||||
| 	{"jxh65"}, | ||||
| 	{"sc2300"}, | ||||
| 	{"ov2735b"}, | ||||
| 	{"jxv01"}, | ||||
| 	{"ps5230"}, | ||||
| 	{"ps5250"}, | ||||
| 	{"ov2718"}, | ||||
| 	{"ov2732"}, | ||||
| 	{"sc2235"}, | ||||
| 	{"jxk02"}, | ||||
| 	{"ov7740"}, | ||||
| 	{"hm2140"}, | ||||
| 	{"gc2033"}, | ||||
| 	{"jxf28"}, | ||||
| 	{"os02b10"}, | ||||
| 	{"os05a10"}, | ||||
| 	{"sc2232"}, | ||||
| 	{"sc2232h"}, | ||||
| 	{"sc2230"}, | ||||
| 	{"sc4236"}, | ||||
| 	{"sc1245"}, | ||||
| 	{"sc1245a"}, | ||||
| 	{"gc1034"}, | ||||
| 	{"sc1235"}, | ||||
| 	{"jxf23"}, | ||||
| 	{"ps5270"}, | ||||
| 	{"sp140a"}, | ||||
| 	{"sc2310"}, | ||||
| 	{"hm2131"}, | ||||
| 	{"mis2003"}, | ||||
| 	{"jxk03"}, | ||||
| 	{"sc5235"}, | ||||
| 	{"ov5648"}, | ||||
| 	{"ps5280"}, | ||||
| 	{"jxf23s"}, | ||||
| 	{"gc2053"}, | ||||
| 	{"sc4335"}, | ||||
| 	{"ps5260"}, | ||||
| 	{"os04b10"}, | ||||
| 	{"jxk05"}, | ||||
| 	{"jxh63"}, | ||||
| 	{"sc2335"}, | ||||
| 	{"jxf37"}, | ||||
| 	{"gc4653"}, | ||||
| 	{"c23a98"}, | ||||
| 	{"sc3335"}, | ||||
| 	{"sc3235"}, | ||||
| 	{"sc200ai"}, | ||||
| 	{"sc401ai"}, | ||||
| 	{"sc500ai"}, | ||||
| 	{"jxq03"}, | ||||
| 	{"jxq03p"}, | ||||
| 	{"sc3338"}, | ||||
| 	{"imx334"}, | ||||
| 	{"imx335"}, | ||||
| 	{"imx415"}, | ||||
| }; | ||||
| int main(int argc,char **argv) | ||||
| { | ||||
| 	int ret  = 0; | ||||
| 	int fd   = 0; | ||||
| 	int data = -1; | ||||
| 	/* open device file */ | ||||
| 	fd = open("/dev/sinfo", O_RDWR); | ||||
| 	if (-1 == fd) { | ||||
| 		printf("err: open failed\n"); | ||||
| 		return -1; | ||||
| 	} | ||||
| 	/* iotcl to get sensor info. */ | ||||
| 	/* cmd is IOCTL_SINFO_GET, data note sensor type according to SENSOR_TYPE */ | ||||
| 
 | ||||
| 	ret = ioctl(fd,IOCTL_SINFO_GET,&data); | ||||
| 	if (0 != ret) { | ||||
| 		printf("err: ioctl failed\n"); | ||||
| 		return ret; | ||||
| 	} | ||||
| 	if (SENSOR_TYPE_INVALID == data) | ||||
| 		printf("##### sensor not found\n"); | ||||
| 	else | ||||
| 		printf("##### sensor : %s\n", g_sinfo[data].name); | ||||
| 
 | ||||
| 	/* close device file */ | ||||
| 	close(fd); | ||||
| 	return 0; | ||||
| } | ||||
|  | @ -1,700 +0,0 @@ | |||
| /*
 | ||||
|  * sensor_info.c | ||||
|  * | ||||
|  * Copyright (C) 2012 Ingenic Semiconductor Co., Ltd. | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License version 2 as | ||||
|  * published by the Free Software Foundation. | ||||
|  */ | ||||
| 
 | ||||
| #include <linux/init.h> | ||||
| #include <linux/module.h> | ||||
| #include <linux/slab.h> | ||||
| #include <linux/i2c.h> | ||||
| #include <linux/delay.h> | ||||
| #include <linux/gpio.h> | ||||
| #include <linux/clk.h> | ||||
| #include <linux/cdev.h> | ||||
| #include <linux/fs.h> | ||||
| #include <linux/unistd.h> | ||||
| #include <linux/types.h> | ||||
| #include <linux/ioctl.h> | ||||
| #include <linux/miscdevice.h> | ||||
| #include <linux/mutex.h> | ||||
| #include <jz_proc.h> | ||||
| 
 | ||||
| #include <linux/module.h> | ||||
| #include <linux/proc_fs.h> | ||||
| #include <linux/seq_file.h> | ||||
| 
 | ||||
| #include <soc/gpio.h> | ||||
| 
 | ||||
| #ifdef CONFIG_SOC_T40 | ||||
| static unsigned i2c_adapter_nr = 1; | ||||
| #else | ||||
| static unsigned i2c_adapter_nr = 0; | ||||
| #endif | ||||
| module_param(i2c_adapter_nr, uint, 0644); | ||||
| MODULE_PARM_DESC(i2c_adapter_nr, "sensor used i2c_adapter nr"); | ||||
| 
 | ||||
| #ifdef CONFIG_SOC_T40 | ||||
| static int reset_gpio = GPIO_PC(27); | ||||
| #else | ||||
| static int reset_gpio = GPIO_PA(18); | ||||
| #endif | ||||
| module_param(reset_gpio, int, S_IRUGO); | ||||
| MODULE_PARM_DESC(reset_gpio, "Reset GPIO NUM"); | ||||
| 
 | ||||
| static int pwdn_gpio = -1; | ||||
| module_param(pwdn_gpio, int, S_IRUGO); | ||||
| MODULE_PARM_DESC(pwdn_gpio, "Power down GPIO NUM"); | ||||
| 
 | ||||
| #ifdef CONFIG_SOC_T40 | ||||
| static int cim1_gpio = GPIO_PC(30); | ||||
| module_param(cim1_gpio, int, S_IRUGO); | ||||
| MODULE_PARM_DESC(cim1_gpio, "Cim1 GPIO NUM"); | ||||
| #endif | ||||
| 
 | ||||
| #define SENSOR_INFO_IOC_MAGIC  'S' | ||||
| #define IOCTL_SINFO_GET			_IO(SENSOR_INFO_IOC_MAGIC, 100) | ||||
| #define IOCTL_SINFO_FLASH		_IO(SENSOR_INFO_IOC_MAGIC, 101) | ||||
| 
 | ||||
| #define SENSOR_TYPE_INVALID	-1 | ||||
| 
 | ||||
| #define I2C_WRITE 0 | ||||
| #define I2C_READ  1 | ||||
| 
 | ||||
| struct i2c_trans { | ||||
| 	uint32_t addr; | ||||
| 	uint32_t r_w; | ||||
| 	uint32_t data; | ||||
| 	uint32_t datalen; | ||||
| }; | ||||
| 
 | ||||
| typedef struct SENSOR_INFO_S | ||||
| { | ||||
| 	uint8_t *name; | ||||
| 	uint8_t i2c_addr; | ||||
| 	uint8_t *clk_name; | ||||
| 	uint32_t clk; | ||||
| 
 | ||||
| 	uint32_t id_value[8]; | ||||
| 	uint32_t id_value_len; | ||||
| 	uint32_t id_addr[8]; | ||||
| 	uint32_t id_addr_len; | ||||
| 	uint8_t id_cnt; | ||||
| 
 | ||||
| 	struct i2c_adapter *adap; | ||||
| } SENSOR_INFO_T, *SENSOR_INFO_P; | ||||
| 
 | ||||
| SENSOR_INFO_T g_sinfo[] = | ||||
| { | ||||
| 	{"ov9712", 0x30,  "cgu_cim", 24000000, {0x97, 0x11}, 1, {0xa, 0xb}, 1, 2, NULL}, | ||||
| 	{"ov9732", 0x36,  "cgu_cim", 24000000, {0x97, 0x32}, 1, {0x300a, 0x300b}, 2, 2, NULL}, | ||||
| 	{"ov9750", 0x36,  "cgu_cim", 24000000, {0x97, 0x50}, 1, {0x300b, 0x300c}, 2, 2, NULL}, | ||||
| 	{"jxh42",  0x30,  "cgu_cim", 24000000, {0xa0, 0x42, 0x81}, 1, {0xa, 0xb, 0x9}, 1, 3, NULL}, | ||||
| 	{"sc1035", 0x30,  "cgu_cim", 24000000, {0xf0, 0x00}, 1, {0x580b, 0x3c05}, 2, 2, NULL}, | ||||
| 	{"sc1135", 0x30,  "cgu_cim", 24000000, {0x00, 0x35}, 1, {0x580b, 0x2148}, 2, 2, NULL}, | ||||
| 	{"sc1045", 0x30,  "cgu_cim", 24000000, {0x10, 0x45}, 1, {0x3107, 0x3108}, 2, 2, NULL}, | ||||
| 	{"sc1145", 0x30,  "cgu_cim", 24000000, {0x11, 0x45}, 1, {0x3107, 0x3108}, 2, 2, NULL}, | ||||
| 	{"ar0130", 0x10,  "cgu_cim", 24000000, {0x2402}, 2, {0x3000}, 2, 1, NULL}, | ||||
| 	{"jxh61",  0x30,  "cgu_cim", 24000000, {0xa0, 0x42, 0x3}, 1, {0xa, 0xb, 0x9}, 1, 3, NULL}, | ||||
| 	{"gc2083", 0x37,  "cgu_cim", 24000000, {0x20, 0x83}, 1, {0x3f0, 0x3f1}, 2, 2, NULL}, | ||||
| 	{"gc1024", 0x3c,  "cgu_cim", 24000000, {0x10, 0x04}, 1, {0xf0, 0xf1}, 1, 2, NULL}, | ||||
| 	{"gc1064", 0x3c,  "cgu_cim", 24000000, {0x10, 0x24}, 1, {0xf0, 0xf1}, 1, 2, NULL}, | ||||
| 	{"gc2023", 0x37,  "cgu_cim", 24000000, {0x20, 0x23}, 1, {0xf0, 0xf1}, 1, 2, NULL}, | ||||
| 	{"bf3115", 0x6e,  "cgu_cim", 24000000, {0x31, 0x16}, 1, {0xfc, 0xfd}, 1, 2, NULL}, | ||||
| 	{"imx225", 0x1a,  "cgu_cim", 24000000, {0x10, 0x01}, 1, {0x3004, 0x3013}, 2, 2, NULL}, | ||||
| 	{"ov2710", 0x36,  "cgu_cim", 24000000, {0x27, 0x10}, 1, {0x300a, 0x300b}, 2, 2, NULL}, | ||||
| 	{"imx323", 0x1a,  "cgu_cim", 37125000, {0x50, 0x0}, 1, {0x301c, 0x301d}, 2, 2, NULL}, | ||||
| 	{"sc2135", 0x30,  "cgu_cim", 24000000, {0x21, 0x35}, 1, {0x3107, 0x3108}, 2, 2, NULL}, | ||||
| 	{"sp1409", 0x34,  "cgu_cim", 24000000, {0x14, 0x09}, 1, {0x04, 0x05}, 1, 2, NULL}, | ||||
| 	{"jxh62",  0x30,  "cgu_cim", 24000000, {0xa0, 0x62}, 1, {0xa, 0xb}, 1, 2, NULL}, | ||||
| 	{"bg0806", 0x32,  "cgu_cim", 24000000, {0x08, 0x06}, 1, {0x0000, 0x0001}, 2, 2, NULL}, | ||||
| 	{"ov4689", 0x36,  "cgu_cim", 24000000, {0x46, 0x88}, 1, {0x300a, 0x300b}, 2, 2, NULL}, | ||||
| 	{"jxf22",  0x40,  "cgu_cim", 24000000, {0x0f, 0x22}, 1, {0xa, 0xb}, 1, 2, NULL}, | ||||
| 	{"imx322", 0x1a,  "cgu_cim", 37125000, {0x50, 0x0}, 1, {0x301c, 0x301d}, 2, 2, NULL}, | ||||
| 	{"imx307", 0x1a,  "cgu_cim", 37125000, {0xA0, 0xB2}, 1, {0x3008, 0x301e}, 2, 2, NULL}, | ||||
| 	{"imx291", 0x1a,  "cgu_cim", 37125000, {0xA0, 0xB2}, 1, {0x3008, 0x301e}, 2, 2, NULL}, | ||||
| 	{"ov2735", 0x3c,  "cgu_cim", 24000000, {0x27, 0x35, 0x05}, 1, {0x02, 0x03, 0x04}, 1, 3, NULL}, | ||||
| 	{"sc3035", 0x30,  "cgu_cim", 24000000, {0x30, 0x35}, 1, {0x3107, 0x3108}, 2, 2, NULL}, | ||||
| 	{"ar0237", 0x10,  "cgu_cim", 27000000, {0x0256}, 2, {0x3000}, 2, 1, NULL}, | ||||
| 	{"sc2145", 0x30,  "cgu_cim", 24000000, {0x21, 0x45}, 1, {0x3107, 0x3108}, 2, 2, NULL}, | ||||
| 	{"jxh65",  0x30,  "cgu_cim", 24000000, {0x0a, 0x65}, 1, {0xa, 0xb}, 1, 2, NULL}, | ||||
| 	{"sc2300", 0x30,  "cgu_cim", 24000000, {0x23, 0x00}, 1, {0x3107, 0x3108}, 2, 2, NULL}, | ||||
| 	{"ov2735b", 0x3c,  "cgu_cim", 24000000, {0x27, 0x35, 0x6, 0x7}, 1, {0x02, 0x03, 0x04, 0x04}, 1, 4, NULL}, | ||||
| 	{"jxv01",  0x21,  "cgu_cim", 27000000, {0x0e, 0x04}, 1, {0xa, 0xb}, 1, 2, NULL}, | ||||
| 	{"ps5230", 0x48,  "cgu_cim", 24000000, {0x52, 0x30}, 1, {0x00, 0x01}, 1, 2, NULL}, | ||||
| 	{"ps5250", 0x48,  "cgu_cim", 24000000, {0x52, 0x50}, 1, {0x00, 0x01}, 1, 2, NULL}, | ||||
| 	{"ov2718", 0x36,  "cgu_cim", 24000000, {0x27, 0x70}, 1, {0x300a, 0x300b}, 2, 2, NULL}, | ||||
| 	{"ov2732", 0x36,  "cgu_cim", 24000000, {0x00, 0x27, 0x32}, 1, {0x300a, 0x300b, 0x300c}, 2, 3, NULL}, | ||||
| 	{"sc2235", 0x30,  "cgu_cim", 24000000, {0x22, 0x35}, 1, {0x3107, 0x3108}, 2, 2, NULL}, | ||||
| 	{"jxk02",  0x40,  "cgu_cim", 24000000, {0x04, 0x03}, 1, {0xa, 0xb}, 1, 2, NULL}, | ||||
| 	{"ov7740", 0x21,  "cgu_cim", 24000000, {0x77, 0x42}, 1, {0x0a, 0x0b}, 1, 2, NULL}, | ||||
| 	{"hm2140", 0x24,  "cgu_cim", 24000000, {0x21, 0x40}, 1, {0x0000, 0x0001}, 2, 2, NULL}, | ||||
| 	{"gc2033", 0x37,  "cgu_cim", 24000000, {0x20, 0x33}, 1, {0xf0, 0xf1}, 1, 2, NULL}, | ||||
| 	{"jxf28",  0x40,  "cgu_cim", 24000000, {0x0f, 0x28}, 1, {0xa, 0xb}, 1, 2, NULL}, | ||||
| 	{"os02b10", 0x3c,  "cgu_cim", 24000000, {0x23, 0x08}, 1, {0x02, 0x03}, 1, 2, NULL}, | ||||
| 	{"os05a10", 0x36,  "cgu_cim", 24000000, {0x53, 0x05, 0x41}, 1, {0x300a, 0x300b, 0x300c}, 2, 3, NULL}, | ||||
| 	{"sc2232", 0x30,  "cgu_cim", 24000000, {0x22, 0x32, 0x01}, 1, {0x3107, 0x3108, 0x3109}, 2, 3, NULL}, | ||||
| 	{"sc2232h", 0x30,  "cgu_cim", 24000000, {0xcb, 0x07, 0x01}, 1, {0x3107, 0x3108, 0x3109}, 2, 3, NULL}, | ||||
| 	{"sc2230", 0x30,  "cgu_cim", 24000000, {0x22, 0x32, 0x20}, 1, {0x3107, 0x3108, 0x3109}, 2, 3, NULL}, | ||||
| 	{"sc4236", 0x30,  "cgu_cim", 24000000, {0x32, 0x35}, 1, {0x3107, 0x3108}, 2, 2, NULL}, | ||||
| 	{"sc1245", 0x30,  "cgu_cim", 24000000, {0x12, 0x45, 0x03}, 1, {0x3107, 0x3108, 0x3020}, 2, 3, NULL}, | ||||
| 	{"sc1245a", 0x30,  "cgu_cim", 24000000, {0x12, 0x45, 0x02}, 1, {0x3107, 0x3108, 0x3020}, 2, 3, NULL}, | ||||
| 	{"gc1034", 0x21,  "cgu_cim", 24000000, {0x10, 0x34}, 1, {0xf0, 0xf1}, 1, 2, NULL}, | ||||
| 	{"sc1235", 0x30,  "cgu_cim", 24000000, {0x12, 0x35}, 1, {0x3107, 0x3108}, 2, 2, NULL}, | ||||
| 	{"jxf23",  0x40,  "cgu_cim", 24000000, {0x0f, 0x23}, 1, {0xa, 0xb}, 1, 2, NULL}, | ||||
| 	{"ps5270", 0x48,  "cgu_cim", 24000000, {0x52, 0x70}, 1, {0x00, 0x01}, 1, 2, NULL}, | ||||
| 	{"sp140a", 0x3c,  "cgu_cim", 24000000, {0x14, 0x0a}, 1, {0x02, 0x03}, 1, 2, NULL}, | ||||
| 	{"sc2310", 0x30,  "cgu_cim", 24000000, {0x23, 0x11}, 1, {0x3107, 0x3108}, 2, 2, NULL}, | ||||
| 	{"hm2131", 0x24,  "cgu_cim", 24000000, {0x14, 0x0a}, 1, {0x0000, 0x0001}, 2, 2, NULL}, | ||||
| 	{"mis2003", 0x30,  "cgu_cim", 24000000, {0x20, 0x03}, 1, {0x3000, 0x3001}, 2, 2, NULL}, | ||||
| 	{"jxk03",  0x40,  "cgu_cim", 24000000, {0x05, 0x03}, 1, {0xa, 0xb}, 1, 2, NULL}, | ||||
| 	{"sc5235", 0x30,  "cgu_cim", 24000000, {0x52, 0x35}, 1, {0x3107, 0x3108}, 2, 2, NULL}, | ||||
| 	{"ov5648", 0x36,  "cgu_cim", 24000000, {0x56, 0x48}, 1, {0x300a, 0x300b}, 2, 2, NULL}, | ||||
| 	{"ps5280", 0x48,  "cgu_cim", 24000000, {0x52, 0x80}, 1, {0x00, 0x01}, 1, 2, NULL}, | ||||
| 	{"jxf23s", 0x40,  "cgu_cim", 24000000, {0x0f, 0x23}, 1, {0xa, 0xb}, 1, 2, NULL}, | ||||
| 	{"gc2053", 0x37,  "cgu_cim", 24000000, {0x20, 0x53}, 1, {0xf0, 0xf1}, 1, 2, NULL}, | ||||
| 	{"sc4335", 0x30,  "cgu_cim", 27000000, {0xcd, 0x01}, 1, {0x3107, 0x3108}, 2, 2, NULL}, | ||||
| 	{"ps5260", 0x48,  "cgu_cim", 24000000, {0x52, 0x60}, 1, {0x00, 0x01}, 1, 2, NULL}, | ||||
| 	{"os04b10", 0x3c,  "cgu_cim", 24000000, {0x43, 0x08, 0x01}, 1, {0x02, 0x03, 0x04}, 1, 3, NULL}, | ||||
| 	{"jxk05",  0x40,  "cgu_cim", 24000000, {0x05, 0x05}, 1, {0xa, 0xb}, 1, 2, NULL}, | ||||
| 	{"jxh63",  0x40,  "cgu_cim", 24000000, {0x0a, 0x63}, 1, {0x0a, 0x0b}, 1, 2, NULL}, | ||||
| 	{"sc2335", 0x30,  "cgu_cim", 24000000, {0xcb, 0x14}, 1, {0x3107, 0x3108}, 2, 2, NULL}, | ||||
| 	{"jxf37",  0x40,  "cgu_cim", 24000000, {0x0f, 0x37}, 1, {0xa, 0xb}, 1, 2, NULL}, | ||||
| 	{"gc4653", 0x29,  "cgu_cim", 24000000, {0x46, 0x53}, 1, {0x03f0, 0x03f1}, 2, 2, NULL}, | ||||
| 	{"c23a98", 0x36,  "cgu_cim", 24000000, {0x23, 0x98}, 1, {0x0000, 0x0001}, 2, 2, NULL}, | ||||
| 	{"sc3335", 0x30,  "cgu_cim", 24000000, {0xcc, 0x1a}, 1, {0x3107, 0x3108}, 2, 2, NULL}, | ||||
| 	{"sc3235", 0x30,  "cgu_cim", 24000000, {0xcc, 0x05}, 1, {0x3107, 0x3108}, 2, 2, NULL}, | ||||
| 	{"sc200ai", 0x30,  "cgu_cim", 24000000, {0xcb, 0x1c}, 1, {0x3107, 0x3108}, 2, 2, NULL}, | ||||
| 	{"sc401ai", 0x30,  "cgu_cim", 24000000, {0xcd, 0x2e}, 1, {0x3107, 0x3108}, 2, 2, NULL}, | ||||
| 	{"sc500ai", 0x30,  "cgu_cim", 24000000, {0xce, 0x1f}, 1, {0x3107, 0x3108}, 2, 2, NULL}, | ||||
| 	{"jxq03",  0x40,  "cgu_cim", 24000000, {0x05, 0x07}, 1, {0xa, 0xb}, 1, 2, NULL}, | ||||
| 	{"jxq03p",  0x40,  "cgu_cim", 24000000, {0x08, 0x43}, 1, {0xa, 0xb}, 1, 2, NULL}, | ||||
| 	{"sc3338", 0x30,  "cgu_cim", 24000000, {0xcc, 0x41}, 1, {0x3107, 0x3108}, 2, 2, NULL}, | ||||
| 	{"imx334", 0x1a,  "cgu_cim", 37125000, {0x20, 0x03}, 1, {0x302e, 0x302f}, 2, 2, NULL}, | ||||
| 	{"imx335", 0x1a,  "cgu_cim", 37125000, {0x08, 0x0}, 1, {0x302e, 0x302f}, 2, 2, NULL}, | ||||
| 	{"imx415", 0x1a,  "cgu_cim", 37125000, {0x28, 0x23}, 1, {0x3b00, 0x3b06}, 2, 2, NULL}, | ||||
| }; | ||||
| 
 | ||||
| static int8_t g_sensor_id = -1; | ||||
| static struct mutex g_mutex; | ||||
| 
 | ||||
| int sensor_read(SENSOR_INFO_P sinfo, struct i2c_adapter *adap, uint32_t addr, uint32_t *value) | ||||
| { | ||||
| 	int ret; | ||||
| 	uint8_t buf[4] = {0}; | ||||
| 	uint8_t data[4] = {0}; | ||||
| 
 | ||||
| 	uint8_t rlen = sinfo->id_value_len; | ||||
| 	uint8_t wlen = sinfo->id_addr_len; | ||||
| 	struct i2c_msg msg[2] = { | ||||
| 		[0] = { | ||||
| 			.addr	= sinfo->i2c_addr, | ||||
| 			.flags	= 0, | ||||
| 			.len	= wlen, | ||||
| 			.buf	= buf, | ||||
| 		}, | ||||
| 		[1] = { | ||||
| 			.addr	= sinfo->i2c_addr, | ||||
| 			.flags	= I2C_M_RD, | ||||
| 			.len	= rlen, | ||||
| 			.buf	= data, | ||||
| 		} | ||||
| 	}; | ||||
| 
 | ||||
| 	if (1 == wlen) { | ||||
| 		buf[0] = addr&0xff; | ||||
| 	} else if (2 == wlen){ | ||||
| 		buf[0] = (addr>>8)&0xff; | ||||
| 		buf[1] = addr&0xff; | ||||
| 	} else if (3 == wlen){ | ||||
| 		buf[0] = (addr>>16)&0xff; | ||||
| 		buf[1] = (addr>>8)&0xff; | ||||
| 		buf[2] = addr&0xff; | ||||
| 	} else if (4 == wlen){ | ||||
| 		buf[0] = (addr>>24)&0xff; | ||||
| 		buf[1] = (addr>>16)&0xff; | ||||
| 		buf[2] = (addr>>8)&0xff; | ||||
| 		buf[3] = addr&0xff; | ||||
| 	} else { | ||||
| 		printk("error: %s,%d wlen = %d\n", __func__, __LINE__, wlen); | ||||
| 	} | ||||
| 	ret = i2c_transfer(adap, msg, 2); | ||||
| 	if (ret > 0) ret = 0; | ||||
| 	if (0 != ret) | ||||
| 		printk("error: %s,%d ret = %d\n", __func__, __LINE__, ret); | ||||
| 	if (1 == rlen) { | ||||
| 		*value = data[0]; | ||||
| 	} else if (2 == rlen){ | ||||
| 		*value = (data[0]<<8)|data[1]; | ||||
| 	} else if (3 == rlen){ | ||||
| 		*value = (data[0]<<16)|(data[1]<<8)|data[2]; | ||||
| 	} else if (4 == rlen){ | ||||
| 		*value = (data[0]<<24)|(data[1]<<16)|(data[2]<<8)|data[3]; | ||||
| 	} else { | ||||
| 		printk("error: %s,%d rlen = %d\n", __func__, __LINE__, rlen); | ||||
| 	} | ||||
| 	printk(" sensor_read: addr=0x%x value = 0x%x\n", addr, *value); | ||||
| 	return ret; | ||||
| } | ||||
| static int32_t process_one_adapter(struct device *dev, void *data) | ||||
| { | ||||
| 	int32_t ret; | ||||
| 	int32_t i = 0; | ||||
| 	int32_t j = 0; | ||||
| 	struct clk *mclk; | ||||
| 	struct i2c_adapter *adap; | ||||
| 	uint8_t scnt = sizeof(g_sinfo)/sizeof(g_sinfo[0]); | ||||
| 	mutex_lock(&g_mutex); | ||||
| 	if (dev->type != &i2c_adapter_type) { | ||||
| 		mutex_unlock(&g_mutex); | ||||
| 		return 0; | ||||
| 	} | ||||
| 
 | ||||
| 	adap = to_i2c_adapter(dev); | ||||
| 	printk("name : %s nr : %d\n", adap->name, adap->nr); | ||||
| 
 | ||||
| 	if (adap->nr != i2c_adapter_nr) { | ||||
| 		mutex_unlock(&g_mutex); | ||||
| 		return 0; | ||||
| 	} | ||||
| 
 | ||||
| #ifdef CONFIG_SOC_T40 | ||||
| 	if(cim1_gpio != -1){ | ||||
| 		ret = gpio_request(cim1_gpio,"cim1"); | ||||
| 		if(!ret){ | ||||
| 			jzgpio_set_func((cim1_gpio / 32), GPIO_FUNC_1, 1 << (cim1_gpio % 32)); | ||||
| 		} | ||||
| 	} | ||||
| #endif | ||||
| 
 | ||||
| 	for (i = 0; i < scnt; i++) { | ||||
| 		uint8_t idcnt = g_sinfo[i].id_cnt; | ||||
| #ifdef CONFIG_SOC_T40 | ||||
| 		g_sinfo[i].clk_name = "div_cim1"; | ||||
| #endif | ||||
| 		mclk = clk_get(NULL, g_sinfo[i].clk_name); | ||||
| 		if (IS_ERR(mclk)) { | ||||
| 			printk("Cannot get sensor input clock cgu_cim\n"); | ||||
| 			mutex_unlock(&g_mutex); | ||||
| 			return PTR_ERR(mclk); | ||||
| 		} | ||||
| 		clk_set_rate(mclk, g_sinfo[i].clk); | ||||
| #ifdef CONFIG_SOC_T40 | ||||
| 		clk_prepare_enable(mclk); | ||||
| #else | ||||
| 		clk_enable(mclk); | ||||
| #endif | ||||
| 		if(reset_gpio != -1){ | ||||
| 			ret = gpio_request(reset_gpio,"reset"); | ||||
| 			if(!ret){ | ||||
| 				gpio_direction_output(reset_gpio, 1); | ||||
| 				msleep(20); | ||||
| 				gpio_direction_output(reset_gpio, 0); | ||||
| 				if(strcmp(g_sinfo[i].name, "sp1409") == 0) | ||||
| 					msleep(600); | ||||
| 				else{ | ||||
| 					msleep(20); | ||||
| 					gpio_direction_output(reset_gpio, 1); | ||||
| 					msleep(20); | ||||
| 				} | ||||
| 			}else{ | ||||
| 				printk("gpio requrest fail %d\n",reset_gpio); | ||||
| 			} | ||||
| 		} | ||||
| 		if(pwdn_gpio != -1){ | ||||
| 			ret = gpio_request(pwdn_gpio,"pwdn"); | ||||
| 			if(!ret){ | ||||
| 				gpio_direction_output(pwdn_gpio, 1); | ||||
| 				msleep(150); | ||||
| 				gpio_direction_output(pwdn_gpio, 0); | ||||
| 				if(strcmp(g_sinfo[i].name, "sp1409") == 0) | ||||
| 					msleep(600); | ||||
| 				else | ||||
| 					msleep(10); | ||||
| 			}else{ | ||||
| 				printk("gpio requrest fail %d\n",pwdn_gpio); | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		for (j = 0; j < idcnt; j++) { | ||||
| 			uint32_t value = 0; | ||||
| 			ret = sensor_read(&g_sinfo[i], adap, g_sinfo[i].id_addr[j], &value); | ||||
| 			if (0 != ret) { | ||||
| 				printk("err sensor read addr = 0x%x, value = 0x%x\n", g_sinfo[i].id_addr[j], value); | ||||
| 				break; | ||||
| 			} | ||||
| 			if(strcmp(g_sinfo[i].name, "ov2735b") == 0 && j == 2){ | ||||
| 				if (value == g_sinfo[i].id_value[j]) | ||||
| 					j++; | ||||
| 			} | ||||
| 			else | ||||
| 				if (value != g_sinfo[i].id_value[j]) | ||||
| 					break; | ||||
| 		} | ||||
| 
 | ||||
| 		if (-1 != reset_gpio) | ||||
| 			gpio_free(reset_gpio); | ||||
| 		if (-1 != pwdn_gpio) | ||||
| 			gpio_free(pwdn_gpio); | ||||
| 		clk_disable(mclk); | ||||
| 		clk_put(mclk); | ||||
| 		if (j == idcnt) { | ||||
| 			printk("info: success sensor find : %s\n", g_sinfo[i].name); | ||||
| 			g_sinfo[i].adap = adap; | ||||
| 			g_sensor_id = i; | ||||
| 			goto end_sensor_find; | ||||
| 		} | ||||
| 	} | ||||
| 	printk("info: failed sensor find\n"); | ||||
| 	g_sensor_id = -1; | ||||
| 	mutex_unlock(&g_mutex); | ||||
| 	return 0; | ||||
| end_sensor_find: | ||||
| 	mutex_unlock(&g_mutex); | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int32_t sensor_open(void) | ||||
| { | ||||
| 	int ret = -1; | ||||
| 	struct clk *mclk; | ||||
| 	if (-1 == g_sensor_id) | ||||
| 		return 0; | ||||
| 
 | ||||
| 	mutex_lock(&g_mutex); | ||||
| #ifdef CONFIG_SOC_T40 | ||||
| 	g_sinfo[g_sensor_id].clk_name = "div_cim1"; | ||||
| #endif | ||||
| 	mclk = clk_get(NULL, g_sinfo[g_sensor_id].clk_name); | ||||
| 	if (IS_ERR(mclk)) { | ||||
| 		printk("Cannot get sensor input clock cgu_cim\n"); | ||||
| 		mutex_unlock(&g_mutex); | ||||
| 		return PTR_ERR(mclk); | ||||
| 	} | ||||
| 	clk_set_rate(mclk, g_sinfo[g_sensor_id].clk); | ||||
| #ifdef CONFIG_SOC_T40 | ||||
| 	clk_prepare_enable(mclk); | ||||
| #else | ||||
| 	clk_enable(mclk); | ||||
| #endif | ||||
| 	if(reset_gpio != -1){ | ||||
| 		ret = gpio_request(reset_gpio,"reset"); | ||||
| 		if(!ret){ | ||||
| 			gpio_direction_output(reset_gpio, 1); | ||||
| 			msleep(20); | ||||
| 			gpio_direction_output(reset_gpio, 0); | ||||
| 			msleep(20); | ||||
| 			gpio_direction_output(reset_gpio, 1); | ||||
| 			msleep(20); | ||||
| 		}else{ | ||||
| 			printk("gpio requrest fail %d\n",reset_gpio); | ||||
| 		} | ||||
| 	} | ||||
| 	if(pwdn_gpio != -1){ | ||||
| 		ret = gpio_request(pwdn_gpio,"pwdn"); | ||||
| 		if(!ret){ | ||||
| 			gpio_direction_output(pwdn_gpio, 1); | ||||
| 			msleep(150); | ||||
| 			gpio_direction_output(pwdn_gpio, 0); | ||||
| 			msleep(10); | ||||
| 		}else{ | ||||
| 			printk("gpio requrest fail %d\n",pwdn_gpio); | ||||
| 		} | ||||
| 	} | ||||
| 	mutex_unlock(&g_mutex); | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int32_t sensor_release(void) | ||||
| { | ||||
| 	struct clk *mclk; | ||||
| 	if (-1 == g_sensor_id) | ||||
| 		return 0; | ||||
| 	mutex_lock(&g_mutex); | ||||
| 	mclk = clk_get(NULL, g_sinfo[g_sensor_id].clk_name); | ||||
| 	if (IS_ERR(mclk)) { | ||||
| 		printk("Cannot get sensor input clock cgu_cim\n"); | ||||
| 		mutex_unlock(&g_mutex); | ||||
| 		return PTR_ERR(mclk); | ||||
| 	} | ||||
| 	if (-1 != reset_gpio) | ||||
| 		gpio_free(reset_gpio); | ||||
| 	if (-1 != pwdn_gpio) | ||||
| 		gpio_free(pwdn_gpio); | ||||
| 	clk_disable(mclk); | ||||
| 	clk_put(mclk); | ||||
| 	mutex_unlock(&g_mutex); | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int32_t i2c_read_write(struct device *dev, void *data) | ||||
| { | ||||
| 	int32_t ret; | ||||
| 	struct i2c_adapter *adap; | ||||
| 	struct i2c_trans *t = data; | ||||
| 
 | ||||
| 	uint8_t buf[4] = {0}; | ||||
| 	uint32_t value = 0; | ||||
| 	uint8_t len = t->datalen; | ||||
| 	struct i2c_msg msg = { | ||||
| 			.addr	= t->addr, | ||||
| 			.flags	= (t->r_w == I2C_WRITE)?0:I2C_M_RD, | ||||
| 			.len	= len, | ||||
| 			.buf	= buf, | ||||
| 	}; | ||||
| 
 | ||||
| 
 | ||||
| 	mutex_lock(&g_mutex); | ||||
| 	if (dev->type != &i2c_adapter_type) { | ||||
| 		mutex_unlock(&g_mutex); | ||||
| 		return 0; | ||||
| 	} | ||||
| 
 | ||||
| 	adap = to_i2c_adapter(dev); | ||||
| 	printk("name : %s nr : %d\n", adap->name, adap->nr); | ||||
| 
 | ||||
| 	if (adap->nr != i2c_adapter_nr) { | ||||
| 		mutex_unlock(&g_mutex); | ||||
| 		return 0; | ||||
| 	} | ||||
| 
 | ||||
| 	if (I2C_WRITE == t->r_w) { | ||||
| 		if (1 == len) { | ||||
| 			buf[0] = (t->data)&0xff; | ||||
| 		} else if (2 == len){ | ||||
| 			buf[0] = ((t->data)>>8)&0xff; | ||||
| 			buf[1] = (t->data)&0xff; | ||||
| 		} else if (3 == len){ | ||||
| 			buf[0] = ((t->data)>>16)&0xff; | ||||
| 			buf[1] = ((t->data)>>8)&0xff; | ||||
| 			buf[2] = (t->data)&0xff; | ||||
| 		} else if (4 == len){ | ||||
| 			buf[0] = ((t->data)>>24)&0xff; | ||||
| 			buf[1] = ((t->data)>>16)&0xff; | ||||
| 			buf[2] = ((t->data)>>8)&0xff; | ||||
| 			buf[3] = (t->data)&0xff; | ||||
| 		} else { | ||||
| 			printk("error: %s,%d len = %d\n", __func__, __LINE__, len); | ||||
| 		} | ||||
| 	} | ||||
| 	ret = i2c_transfer(adap, &msg, 1); | ||||
| 	if (ret > 0) ret = 0; | ||||
| 	if (0 != ret) | ||||
| 		printk("error: %s,%d ret = %d\n", __func__, __LINE__, ret); | ||||
| 
 | ||||
| 	if (I2C_READ == t->r_w) { | ||||
| 		if (1 == len) { | ||||
| 			value = buf[0]; | ||||
| 		} else if (2 == len){ | ||||
| 			value = (buf[0]<<8)|buf[1]; | ||||
| 		} else if (3 == len){ | ||||
| 			value = (buf[0]<<16)|(buf[1]<<8)|buf[2]; | ||||
| 		} else if (4 == len){ | ||||
| 			value = (buf[0]<<24)|(buf[1]<<16)|(buf[2]<<8)|buf[3]; | ||||
| 		} else { | ||||
| 			printk("error: %s,%d len = %d\n", __func__, __LINE__, len); | ||||
| 		} | ||||
| 		printk(" i2c: addr=0x%x value = 0x%x\n", t->addr, value); | ||||
| 	} | ||||
| 	mutex_unlock(&g_mutex); | ||||
| 	return 0; | ||||
| } | ||||
| static long sinfo_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) | ||||
| { | ||||
| 	int ret = 0; | ||||
| 	int32_t data; | ||||
| 
 | ||||
| 	mutex_lock(&g_mutex); | ||||
| 	switch (cmd) { | ||||
| 	case IOCTL_SINFO_GET: | ||||
| 		if (-1 == g_sensor_id) | ||||
| 			data = -1; | ||||
| 		else | ||||
| 			data = g_sensor_id; | ||||
| 		if (copy_to_user((void *)arg, &data, sizeof(data))) { | ||||
| 			printk("copy_from_user error!!!\n"); | ||||
| 			ret = -EFAULT; | ||||
| 			break; | ||||
| 		} | ||||
| 		break; | ||||
| 	case IOCTL_SINFO_FLASH: | ||||
| 		i2c_for_each_dev(NULL, process_one_adapter); | ||||
| 		break; | ||||
| 	default: | ||||
| 		printk("invalid command: 0x%08x\n", cmd); | ||||
| 		ret = -EINVAL; | ||||
| 	} | ||||
| 	mutex_unlock(&g_mutex); | ||||
| 	return ret; | ||||
| } | ||||
| static int sinfo_open(struct inode *inode, struct file *filp) | ||||
| { | ||||
| 	i2c_for_each_dev(NULL, process_one_adapter); | ||||
| 	return 0; | ||||
| } | ||||
| static int sinfo_release(struct inode *inode, struct file *filp) | ||||
| { | ||||
| 	printk ("misc sinfo_release\n"); | ||||
| 	sensor_release(); | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static ssize_t sinfo_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos) | ||||
| { | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static struct file_operations sinfo_fops = | ||||
| { | ||||
| 	.owner = THIS_MODULE, | ||||
| 	.read = sinfo_read, | ||||
| 	.unlocked_ioctl = sinfo_ioctl, | ||||
| 	.open = sinfo_open, | ||||
| 	.release = sinfo_release, | ||||
| }; | ||||
| 
 | ||||
| static struct miscdevice misc_sinfo = { | ||||
| 	.minor = MISC_DYNAMIC_MINOR, | ||||
| 	.name = "sinfo", | ||||
| 	.fops = &sinfo_fops, | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| static int sinfo_proc_show(struct seq_file *m, void *v) | ||||
| { | ||||
| 	if (-1 == g_sensor_id) | ||||
| 		seq_printf(m, "sensor not found\n"); | ||||
| 	else | ||||
| 		seq_printf(m, "sensor :%s\n", g_sinfo[g_sensor_id].name); | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int sinfo_proc_open(struct inode *inode, struct file *file) | ||||
| { | ||||
| 	return single_open(file, sinfo_proc_show, NULL); | ||||
| } | ||||
| 
 | ||||
| ssize_t sinfo_proc_write(struct file *filp, const char *buf, size_t len, loff_t *off) | ||||
| { | ||||
| 	int ret = 0; | ||||
| 	char cmd[100] = {0}; | ||||
| 	uint32_t addr,data,datalen; | ||||
| 
 | ||||
| 	if (len > 100) { | ||||
| 		printk("err: cmd too long\n"); | ||||
| 		return -EFAULT; | ||||
| 	} | ||||
| 	if(copy_from_user(cmd, buf, len)) | ||||
| 	{ | ||||
| 		return -EFAULT; | ||||
| 	} | ||||
| 	/* probe sensor */ | ||||
| 	if (!strncmp(cmd, "1", strlen("1"))) { | ||||
| 		i2c_for_each_dev(NULL, process_one_adapter); | ||||
| 	/* probe sensor */ | ||||
| 	} else if (!strncmp(cmd, "probe", strlen("probe"))) { | ||||
| 		i2c_for_each_dev(NULL, process_one_adapter); | ||||
| 	/* sensor open/release i2c read/write
 | ||||
| 	 * open: set sensor clk,reset | ||||
| 	 * release: free clk,reset gpio | ||||
| 	 * | ||||
| 	 * example: sc2135 | ||||
| 	 * | ||||
| 	 * echo open:sc2135 > /proc/jz/sinfo/info | ||||
| 	 * echo i2c-w:0x30-0x3017-2 > /proc/jz/sinfo/info | ||||
| 	 * echo i2c-r:0x30-1 > /proc/jz/sinfo/info | ||||
| 	 * | ||||
| 	 * */ | ||||
| 	} else if (!strncmp(cmd, "i2c-w:", strlen("i2c-w:"))) { | ||||
| 		ret = sscanf(cmd, "i2c-w:%i-%i-%i", &addr, &data, &datalen); | ||||
| 		if (3 != ret) { | ||||
| 			printk("err: cmd error %s\n", cmd); | ||||
| 			return len; | ||||
| 		} else { | ||||
| 			struct i2c_trans t = {addr, I2C_WRITE, data, datalen}; | ||||
| 			printk("info: i2c-w:%d-%d-%d\n", addr, data, datalen); | ||||
| 			i2c_for_each_dev(&t, i2c_read_write); | ||||
| 		} | ||||
| 	} else if (!strncmp(cmd, "i2c-r:", strlen("i2c-r:"))) { | ||||
| 		ret = sscanf(cmd, "i2c-r:%i-%i", &addr, &datalen); | ||||
| 		if (2 != ret) { | ||||
| 			printk("err: cmd error %s\n", cmd); | ||||
| 			return len; | ||||
| 		} else { | ||||
| 			struct i2c_trans t = {addr, I2C_READ, 0, datalen}; | ||||
| 			printk("info: i2c-r:%d-%d\n", addr, datalen); | ||||
| 			i2c_for_each_dev(&t, i2c_read_write); | ||||
| 		} | ||||
| 	} else if (!strncmp(cmd, "open", strlen("open"))) { | ||||
| 		int i = 0; | ||||
| 		char s[20] = {0}; | ||||
| 		ret = sscanf(cmd, "open:%s", s); | ||||
| 		if (1 != ret) { | ||||
| 			printk("err: cmd error %s\n", cmd); | ||||
| 			return len; | ||||
| 		} else { | ||||
| 			uint8_t scnt = sizeof(g_sinfo)/sizeof(g_sinfo[0]); | ||||
| 			for (i = 0; i < scnt; i++) { | ||||
| 				if (!strcmp(s, g_sinfo[i].name)) { | ||||
| 					g_sensor_id = i; | ||||
| 					break; | ||||
| 				} | ||||
| 			} | ||||
| 			if (i >= scnt) { | ||||
| 				printk("err: sensor not found %s, cmd %s\n", s, cmd); | ||||
| 				return len; | ||||
| 			} | ||||
| 			sensor_open(); | ||||
| 		} | ||||
| 	} else if (!strncmp(cmd, "release", strlen("release"))) { | ||||
| 		sensor_release(); | ||||
| 	} else { | ||||
| 		printk("err: cmd not support\n"); | ||||
| 	} | ||||
| 	return len; | ||||
| } | ||||
| 
 | ||||
| static const struct file_operations sinfo_proc_fops = { | ||||
| 	.owner = THIS_MODULE, | ||||
| 	.open = sinfo_proc_open, | ||||
| 	.read = seq_read, | ||||
| 	.write = sinfo_proc_write, | ||||
| 	.llseek = seq_lseek, | ||||
| 	.release = single_release, | ||||
| }; | ||||
| 
 | ||||
| struct proc_dir_entry *g_sinfo_proc; | ||||
| static __init int init_sinfo(void) | ||||
| { | ||||
| 	int ret = 0; | ||||
| 	mutex_init(&g_mutex); | ||||
| #ifdef CONFIG_SOC_T21 | ||||
| 	*(volatile unsigned int*)(0xB0010104) = 0x1; | ||||
| #endif | ||||
| 	g_sinfo_proc = proc_mkdir("jz/sinfo", 0); | ||||
| 	if (!g_sinfo_proc) { | ||||
| 		printk("err: jz_proc_mkdir failed\n"); | ||||
| 	} | ||||
| 	proc_create_data("info", S_IRUGO, g_sinfo_proc, &sinfo_proc_fops, NULL); | ||||
| 	/* i2c_for_each_dev(NULL, process_one_adapter); */ | ||||
| 	ret = misc_register(&misc_sinfo); | ||||
| 	/* printk("##### g_sensor_id = %d\n", g_sensor_id); */ | ||||
| 	return ret; | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| static __exit void exit_sinfo(void) | ||||
| { | ||||
| 	proc_remove(g_sinfo_proc); | ||||
| 	misc_deregister(&misc_sinfo); | ||||
| } | ||||
| 
 | ||||
| module_init(init_sinfo); | ||||
| module_exit(exit_sinfo); | ||||
| 
 | ||||
| MODULE_DESCRIPTION("A Simple driver for get sensors info "); | ||||
| MODULE_LICENSE("GPL"); | ||||
|  | @ -55,7 +55,7 @@ sync_sensor_param() { | |||
| 
 | ||||
| lsmod | grep "sinfo" >/dev/null | ||||
| if [ $? -ne 0 ]; then | ||||
| 	insmod ${KMOD_PATH/%\//}/sinfo.ko | ||||
| 	modprobe sinfo | ||||
| 	check_return "insmod sinfo" | ||||
| fi | ||||
| 
 | ||||
|  | @ -162,31 +162,31 @@ echo -------------------- | |||
| 
 | ||||
| lsmod | grep "avpu" >/dev/null | ||||
| if [ $? -ne 0 ]; then | ||||
| 	insmod ${KMOD_PATH/%\//}/avpu.ko ${AVPU_PARAM} | ||||
| 	modprobe avpu ${AVPU_PARAM} | ||||
| 	check_return "insmod avpu" | ||||
| fi | ||||
| 
 | ||||
| lsmod | grep "tx_isp" >/dev/null | ||||
| if [ $? -ne 0 ]; then | ||||
| 	insmod ${KMOD_PATH/%\//}/tx-isp-${SOC}.ko ${ISP_PARAM} | ||||
| 	modprobe tx-isp-${SOC} ${ISP_PARAM} | ||||
| 	check_return "insmod isp drv" | ||||
| fi | ||||
| 
 | ||||
| lsmod | grep ${SENSOR} >/dev/null | ||||
| if [ $? -ne 0 ]; then | ||||
| 	insmod ${KMOD_PATH/%\//}/sensor_${SENSOR}_${SOC}.ko ${SENSOR_PARAM} ${SENSOR_EXT_PARAM} | ||||
| 	modprobe sensor_${SENSOR}_${SOC} ${SENSOR_PARAM} ${SENSOR_EXT_PARAM} | ||||
| 	check_return "insmod sensor drv" | ||||
| fi | ||||
| 
 | ||||
| lsmod | grep "audio" >/dev/null | ||||
| if [ $? -ne 0 ]; then | ||||
| 	insmod ${KMOD_PATH/%\//}/audio.ko | ||||
| 	modprobe audio | ||||
| 	check_return "insmod audio" | ||||
| fi | ||||
| 
 | ||||
| lsmod | grep "gpio" >/dev/null | ||||
| if [ $? -ne 0 ]; then | ||||
| 	insmod ${KMOD_PATH/%\//}/gpio.ko | ||||
| 	modprobe gpio | ||||
| 	check_return "insmod gpio" | ||||
| fi | ||||
| 
 | ||||
|  |  | |||
|  | @ -31,35 +31,8 @@ define INGENIC_OSDRV_T31_INSTALL_TARGET_CMDS | |||
| 	$(INSTALL) -m 755 -d $(TARGET_DIR)/lib/modules/3.10.14__isvp_swan_1.0__/ingenic | ||||
| 	# $(INSTALL) -m 644 -t $(TARGET_DIR)/lib/modules/3.10.14__isvp_swan_1.0__/ingenic $(INGENIC_OSDRV_T31_PKGDIR)/files/kmod/*.ko | ||||
| 
 | ||||
| 	$(INSTALL) -m 644 -t $(TARGET_DIR)/lib/modules/3.10.14__isvp_swan_1.0__/ingenic $(INGENIC_OSDRV_T31_PKGDIR)/files/kmod/audio.ko | ||||
| 	$(INSTALL) -m 644 -t $(TARGET_DIR)/lib/modules/3.10.14__isvp_swan_1.0__/ingenic $(INGENIC_OSDRV_T31_PKGDIR)/files/kmod/avpu.ko | ||||
| 	$(INSTALL) -m 644 -t $(TARGET_DIR)/lib/modules/3.10.14__isvp_swan_1.0__/ingenic $(INGENIC_OSDRV_T31_PKGDIR)/files/kmod/gpio.ko | ||||
| 	$(INSTALL) -m 644 -t $(TARGET_DIR)/lib/modules/3.10.14__isvp_swan_1.0__/ingenic $(INGENIC_OSDRV_T31_PKGDIR)/files/kmod/sinfo.ko | ||||
| 	$(INSTALL) -m 644 -t $(TARGET_DIR)/lib/modules/3.10.14__isvp_swan_1.0__/ingenic $(INGENIC_OSDRV_T31_PKGDIR)/files/kmod/tx-isp-t31.ko | ||||
| 
 | ||||
| 	$(INSTALL) -m 644 -t $(TARGET_DIR)/lib/modules/3.10.14__isvp_swan_1.0__/ingenic $(INGENIC_OSDRV_T31_PKGDIR)/files/kmod/sensor_gc2053_t31.ko | ||||
| 	$(INSTALL) -m 644 -t $(TARGET_DIR)/lib/modules/3.10.14__isvp_swan_1.0__/ingenic $(INGENIC_OSDRV_T31_PKGDIR)/files/kmod/sensor_gc2083_t31.ko | ||||
| 	$(INSTALL) -m 644 -t $(TARGET_DIR)/lib/modules/3.10.14__isvp_swan_1.0__/ingenic $(INGENIC_OSDRV_T31_PKGDIR)/files/kmod/sensor_gc4653_t31.ko | ||||
| 	$(INSTALL) -m 644 -t $(TARGET_DIR)/lib/modules/3.10.14__isvp_swan_1.0__/ingenic $(INGENIC_OSDRV_T31_PKGDIR)/files/kmod/sensor_imx307_t31.ko | ||||
| 	$(INSTALL) -m 644 -t $(TARGET_DIR)/lib/modules/3.10.14__isvp_swan_1.0__/ingenic $(INGENIC_OSDRV_T31_PKGDIR)/files/kmod/sensor_jxf37_t31.ko | ||||
| 	$(INSTALL) -m 644 -t $(TARGET_DIR)/lib/modules/3.10.14__isvp_swan_1.0__/ingenic $(INGENIC_OSDRV_T31_PKGDIR)/files/kmod/sensor_jxh62_t31.ko | ||||
| 	$(INSTALL) -m 644 -t $(TARGET_DIR)/lib/modules/3.10.14__isvp_swan_1.0__/ingenic $(INGENIC_OSDRV_T31_PKGDIR)/files/kmod/sensor_jxq03_t31.ko | ||||
| 	$(INSTALL) -m 644 -t $(TARGET_DIR)/lib/modules/3.10.14__isvp_swan_1.0__/ingenic $(INGENIC_OSDRV_T31_PKGDIR)/files/kmod/sensor_jxq03p_t31.ko | ||||
| 	$(INSTALL) -m 644 -t $(TARGET_DIR)/lib/modules/3.10.14__isvp_swan_1.0__/ingenic $(INGENIC_OSDRV_T31_PKGDIR)/files/kmod/sensor_sc200ai_t31.ko | ||||
| 	$(INSTALL) -m 644 -t $(TARGET_DIR)/lib/modules/3.10.14__isvp_swan_1.0__/ingenic $(INGENIC_OSDRV_T31_PKGDIR)/files/kmod/sensor_sc2232h_t31.ko | ||||
| 	$(INSTALL) -m 644 -t $(TARGET_DIR)/lib/modules/3.10.14__isvp_swan_1.0__/ingenic $(INGENIC_OSDRV_T31_PKGDIR)/files/kmod/sensor_sc2335_t31.ko | ||||
| 	$(INSTALL) -m 644 -t $(TARGET_DIR)/lib/modules/3.10.14__isvp_swan_1.0__/ingenic $(INGENIC_OSDRV_T31_PKGDIR)/files/kmod/sensor_sc3338_t31.ko | ||||
| 	$(INSTALL) -m 644 -t $(TARGET_DIR)/lib/modules/3.10.14__isvp_swan_1.0__/ingenic $(INGENIC_OSDRV_T31_PKGDIR)/files/kmod/sensor_sc5235_t31.ko | ||||
| 
 | ||||
| 	$(INSTALL) -m 755 -d $(TARGET_DIR)/usr/bin | ||||
| 	$(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(INGENIC_OSDRV_T31_PKGDIR)/files/script/load* | ||||
| 	$(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(INGENIC_OSDRV_T31_PKGDIR)/files/script/ircut_demo | ||||
| 
 | ||||
| 	# $(INSTALL) -m 755 -d $(TARGET_DIR)/usr/lib/sensors/params | ||||
| 	# $(INSTALL) -m 644 -t $(TARGET_DIR)/usr/lib/sensors/params $(INGENIC_OSDRV_T31_PKGDIR)/files/sensor/params/*.bin | ||||
| 
 | ||||
| 	# $(INSTALL) -m 755 -d $(TARGET_DIR)/usr/lib/sensors/params/WDR | ||||
| 	# $(INSTALL) -m 644 -t $(TARGET_DIR)/usr/lib/sensors/params/WDR $(INGENIC_OSDRV_T31_PKGDIR)/files/sensor/params/WDR/*.bin | ||||
| 
 | ||||
| 	$(INSTALL) -m 755 -d $(TARGET_DIR)/usr/lib | ||||
| 	$(INSTALL) -m 644 -t $(TARGET_DIR)/usr/lib/ $(INGENIC_OSDRV_T31_PKGDIR)/files/lib/*.so | ||||
|  |  | |||
|  | @ -24,7 +24,7 @@ check_return() { | |||
| 
 | ||||
| lsmod | grep "sinfo" >/dev/null | ||||
| if [ $? -ne 0 ]; then | ||||
| 	insmod ${KMOD_PATH/%\//}/sinfo.ko | ||||
| 	modprobe sinfo | ||||
| 	check_return "insmod sinfo" | ||||
| fi | ||||
| 
 | ||||
|  | @ -79,31 +79,31 @@ echo -------------------- | |||
| 
 | ||||
| lsmod | grep "avpu" >/dev/null | ||||
| if [ $? -ne 0 ]; then | ||||
| 	insmod ${KMOD_PATH/%\//}/avpu.ko ${AVPU_PARAM} | ||||
| 	modprobe avpu ${AVPU_PARAM} | ||||
| 	check_return "insmod avpu" | ||||
| fi | ||||
| 
 | ||||
| lsmod | grep "tx_isp" >/dev/null | ||||
| if [ $? -ne 0 ]; then | ||||
| 	insmod ${KMOD_PATH/%\//}/tx-isp-${SOC}.ko ${ISP_PARAM} | ||||
| 	modprobe tx-isp-${SOC} ${ISP_PARAM} | ||||
| 	check_return "insmod isp drv" | ||||
| fi | ||||
| 
 | ||||
| lsmod | grep ${SENSOR} >/dev/null | ||||
| if [ $? -ne 0 ]; then | ||||
| 	insmod ${KMOD_PATH/%\//}/sensor_${SENSOR}_${SOC}.ko ${SENSOR_PARAM} | ||||
| 	modprobe sensor_${SENSOR}_${SOC} ${SENSOR_PARAM} | ||||
| 	check_return "insmod sensor drv" | ||||
| fi | ||||
| 
 | ||||
| lsmod | grep "audio" >/dev/null | ||||
| if [ $? -ne 0 ]; then | ||||
| 	insmod ${KMOD_PATH/%\//}/audio.ko | ||||
| 	modprobe audio | ||||
| 	check_return "insmod audio" | ||||
| fi | ||||
| 
 | ||||
| lsmod | grep "gpio" >/dev/null | ||||
| if [ $? -ne 0 ]; then | ||||
| 	insmod ${KMOD_PATH/%\//}/gpio.ko | ||||
| 	modprobe gpio | ||||
| 	check_return "insmod gpio" | ||||
| fi | ||||
| 
 | ||||
|  |  | |||
|  | @ -24,24 +24,9 @@ define INGENIC_OSDRV_T40_INSTALL_TARGET_CMDS | |||
| 	$(INSTALL) -m 644 -t $(TARGET_DIR)/etc/sensor $(INGENIC_OSDRV_T40_PKGDIR)/files/sensor/params/sc830ai-t40.bin | ||||
| 
 | ||||
| 	$(INSTALL) -m 755 -d $(TARGET_DIR)/lib/modules/4.4.94/ingenic | ||||
| 	$(INSTALL) -m 644 -t $(TARGET_DIR)/lib/modules/4.4.94/ingenic $(INGENIC_OSDRV_T40_PKGDIR)/files/kmod/audio.ko | ||||
| 	$(INSTALL) -m 644 -t $(TARGET_DIR)/lib/modules/4.4.94/ingenic $(INGENIC_OSDRV_T40_PKGDIR)/files/kmod/avpu.ko | ||||
| 	$(INSTALL) -m 644 -t $(TARGET_DIR)/lib/modules/4.4.94/ingenic $(INGENIC_OSDRV_T40_PKGDIR)/files/kmod/dtrng_dev.ko | ||||
| 	$(INSTALL) -m 644 -t $(TARGET_DIR)/lib/modules/4.4.94/ingenic $(INGENIC_OSDRV_T40_PKGDIR)/files/kmod/gpio.ko | ||||
| 	$(INSTALL) -m 644 -t $(TARGET_DIR)/lib/modules/4.4.94/ingenic $(INGENIC_OSDRV_T40_PKGDIR)/files/kmod/mpsys.ko | ||||
| 	$(INSTALL) -m 644 -t $(TARGET_DIR)/lib/modules/4.4.94/ingenic $(INGENIC_OSDRV_T40_PKGDIR)/files/kmod/sinfo.ko | ||||
| 	$(INSTALL) -m 644 -t $(TARGET_DIR)/lib/modules/4.4.94/ingenic $(INGENIC_OSDRV_T40_PKGDIR)/files/kmod/soc-nna.ko | ||||
| 	$(INSTALL) -m 644 -t $(TARGET_DIR)/lib/modules/4.4.94/ingenic $(INGENIC_OSDRV_T40_PKGDIR)/files/kmod/tx-isp-t40.ko | ||||
| 
 | ||||
| 	$(INSTALL) -m 644 -t $(TARGET_DIR)/lib/modules/4.4.94/ingenic $(INGENIC_OSDRV_T40_PKGDIR)/files/kmod/sensor_gc4653_t40.ko | ||||
| 	$(INSTALL) -m 644 -t $(TARGET_DIR)/lib/modules/4.4.94/ingenic $(INGENIC_OSDRV_T40_PKGDIR)/files/kmod/sensor_imx307_t40.ko | ||||
| 	$(INSTALL) -m 644 -t $(TARGET_DIR)/lib/modules/4.4.94/ingenic $(INGENIC_OSDRV_T40_PKGDIR)/files/kmod/sensor_imx335_t40.ko | ||||
| 	$(INSTALL) -m 644 -t $(TARGET_DIR)/lib/modules/4.4.94/ingenic $(INGENIC_OSDRV_T40_PKGDIR)/files/kmod/sensor_imx415_t40.ko | ||||
| 	$(INSTALL) -m 644 -t $(TARGET_DIR)/lib/modules/4.4.94/ingenic $(INGENIC_OSDRV_T40_PKGDIR)/files/kmod/sensor_jxk04_t40.ko | ||||
| 	$(INSTALL) -m 644 -t $(TARGET_DIR)/lib/modules/4.4.94/ingenic $(INGENIC_OSDRV_T40_PKGDIR)/files/kmod/sensor_sc2232h_t40.ko | ||||
| 	$(INSTALL) -m 644 -t $(TARGET_DIR)/lib/modules/4.4.94/ingenic $(INGENIC_OSDRV_T40_PKGDIR)/files/kmod/sensor_sc500ai_t40.ko | ||||
| 	$(INSTALL) -m 644 -t $(TARGET_DIR)/lib/modules/4.4.94/ingenic $(INGENIC_OSDRV_T40_PKGDIR)/files/kmod/sensor_sc3335_t40.ko | ||||
| 	$(INSTALL) -m 644 -t $(TARGET_DIR)/lib/modules/4.4.94/ingenic $(INGENIC_OSDRV_T40_PKGDIR)/files/kmod/sensor_sc5235_t40.ko | ||||
| 
 | ||||
| 	$(INSTALL) -m 755 -d $(TARGET_DIR)/usr/bin | ||||
| 	$(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(INGENIC_OSDRV_T40_PKGDIR)/files/script/load* | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue