HSD AIM915 916 芯片调试

        在车机显示 系统中,AIM915X和AIM916X作为车机和显示屏之间的传输芯片,车机的LVDS视频信号传到显示屏;控制信号如I2C、GPIO可实现双向透传;

一、设备树

开发平台:IMX6D

1、设备节点

2、timing参数

二、分辨率

1、修改为屏幕适配的分辨率

路径:drivers/video/fbdev/core/modedb.c

2、修改相关启动参数

烧录后会显示相关信息

cat /proc/cmdline

3、查看修改后的设备信息

cat /sys/class/graphics/fb0/mode

三、AIM915X AIM916X芯片调试

1、原理图

AIM915X:

AIM916X:

2、IIC地址

915:

Linux 7位地址为0x0C

916:

Linux 7位地址为0x2C

3、PDB

4、上电时序

5、配置步骤

#第 1 步:初始化 915X Rx/Tx 相关寄存器

i2cset -f -y 2 0x0c 0x6A 0x01 sleep 0.01i2cset -f -y 2 0x0c 0x66 0x02 sleep 0.01i2cset -f -y 2 0x0c 0xAD 0x02 sleep 0.01i2cset -f -y 2 0x0c 0x06 0x59 sleep 0.01i2cset -f -y 2 0x0c 0x2F 0x05 sleep 0.01i2cset -f -y 2 0x0c 0x2A 0x30 sleep 0.01i2cset -f -y 2 0x0c 0x2C 0x01 sleep 0.01i2cset -f -y 2 0x0c 0x33 0x35 sleep 0.01i2cset -f -y 2 0x0c 0x32 0xA2 sleep 0.01i2cset -f -y 2 0x0c 0x34 0x00 sleep 0.01i2cset -f -y 2 0x0c 0xA3 0x50 sleep 0.01i2cset -f -y 2 0x0c 0x03 0x3A 

#第 2 步:选择 915X/916X 工作模式,根据需要选择一种模式,进行配置。第 2 步配置完成后,延时 30ms,再配置第 3 步。

40bit 模式i2cset -f -y 2 0x2c 0x42 0x12 i2cset -f -y 2 0x0c 0x6c 0x12 sleep 0.3

# 第 3 步:915X 外设 I2C 地址映射

# 此处是映射触摸的地址,GT9XX(0x14),此处可以不要,后续文章会更新调试触摸的过程
i2cset -f -y 2 0x0c 0x07 0x28 i2cset -f -y 2 0x0c 0x08 0x28 

#第 4 步:916X Rx/Tx 相关寄存器

i2cset -f -y 2 0x0c 0x20 0x03 i2cset -f -y 2 0x0c 0x48 0xFF i2cset -f -y 2 0x2c 0x67 0x37 i2cset -f -y 2 0x2c 0x49 0x3F i2cset -f -y 2 0x0c 0x5A 0xF0 i2cset -f -y 2 0x0c 0x28 0x04 i2cset -f -y 2 0x2c 0x49 0x3A i2cset -f -y 2 0x2c 0x49 0x3E i2cset -f -y 2 0x2c 0x49 0x3F i2cset -f -y 2 0x2c 0x49 0x3E i2cset -f -y 2 0x2c 0x49 0x3F i2cset -f -y 2 0x2c 0x49 0x3E i2cset -f -y 2 0x2c 0x49 0x3F i2cset -f -y 2 0x2c 0x49 0x3E i2cset -f -y 2 0x2c 0x49 0x3F i2cset -f -y 2 0x2c 0x49 0x3E i2cset -f -y 2 0x2c 0x49 0x3F i2cset -f -y 2 0x2c 0x49 0x3E i2cset -f -y 2 0x2c 0x49 0x3F i2cset -f -y 2 0x2c 0x49 0x3E i2cset -f -y 2 0x2c 0x49 0x3F i2cset -f -y 2 0x2c 0x49 0x3E i2cset -f -y 2 0x2c 0x49 0x3F i2cset -f -y 2 0x2c 0x49 0x3E i2cset -f -y 2 0x2c 0x49 0x3F i2cset -f -y 2 0x2c 0x49 0x3E i2cset -f -y 2 0x2c 0x49 0x3F i2cset -f -y 2 0x2c 0x5A 0xF4 i2cset -f -y 2 0x2c 0x40 0xF8 i2cset -f -y 2 0x2c 0x28 0x00 i2cset -f -y 2 0x2c 0x40 0xF0 i2cset -f -y 2 0x2c 0x67 0x33 

#第 5 步:配置 915X 的 GPIO[3:0]GPIO[5:8]至 916X 相应 GPIO 的透传(透传指的是915端控制远端916的GPIO状态)

GPIO2 用作 PWM 915 in 916 outi2cget -y 2 0x0c 0x0B# 916端本地使能背光i2cset -y 2 0x2C 0x1D 0x99 

#第 6 步:配置 915X 端接收 916X 端输入的中断

i2cset -f -y 2 0x0C 0x7F 0x21 

#第 7 步:915X 完成初始化

i2cset -f -y 2 0x0c 0x03 0x1A i2cset -f -y 2 0x0c 0x44 0x16 i2cset -f -y 2 0x0c 0x6F 0x80 i2cset -f -y 2 0x0c 0x72 0x02 i2cset -f -y 2 0x0c 0x72 0x03 i2cset -f -y 2 0x0c 0x6F 0x00 i2cset -f -y 2 0x0c 0x25 0x07 i2cset -f -y 2 0x0c 0x26 0x00 i2cset -f -y 2 0x0c 0x6A 0xC9 i2cset -f -y 2 0x0c 0x72 0x02 i2cset -f -y 2 0x0c 0x72 0x03 i2cset -f -y 2 0x0c 0x73 0x02 i2cset -f -y 2 0x0c 0x73 0x03 i2cset -f -y 2 0x0c 0x26 0x04 i2cset -f -y 2 0x0c 0x6a 0x01 i2cset -f -y 2 0x0c 0x72 0xFF i2cset -f -y 2 0x0c 0x23 0x37 i2cset -f -y 2 0x0c 0x25 0x0F i2cset -f -y 2 0x0c 0x26 0x00 i2cset -f -y 2 0x0c 0x6F 0x80 i2cset -f -y 2 0x0c 0x71 0xBF i2cset -f -y 2 0x0c 0x72 0xBE i2cset -f -y 2 0x0c 0x71 0xFF i2cset -f -y 2 0x0c 0x72 0xFF i2cset -f -y 2 0x0c 0x72 0xFE i2cset -f -y 2 0x0c 0x72 0xFF i2cset -f -y 2 0x0c 0x72 0xFE i2cset -f -y 2 0x0c 0x72 0xFF i2cset -f -y 2 0x0c 0x72 0xFE i2cset -f -y 2 0x0c 0x72 0xFF i2cset -f -y 2 0x0c 0x72 0xFE i2cset -f -y 2 0x0c 0x72 0xFF i2cset -f -y 2 0x0c 0x72 0xFE i2cset -f -y 2 0x0c 0x72 0xFF i2cset -f -y 2 0x0c 0x72 0xFE i2cset -f -y 2 0x0c 0x72 0xFF i2cset -f -y 2 0x0c 0x72 0xFE i2cset -f -y 2 0x0c 0x72 0xFF i2cset -f -y 2 0x0c 0x72 0xFE i2cset -f -y 2 0x0c 0x72 0xFF i2cset -f -y 2 0x0c 0x72 0xFE i2cset -f -y 2 0x0c 0x72 0xFF i2cset -f -y 2 0x0c 0x26 0x04 i2cset -f -y 2 0x0c 0x6a 0x09 i2cset -f -y 2 0x0c 0x6f 0x00 i2cset -f -y 2 0x0c 0x6a 0x01 i2cset -f -y 2 0x0c 0x23 0x33 

#第八步:驱动编写

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/err.h>
#include <linux/i2c.h>
#include <linux/slab.h>
#include <linux/interrupt.h>
#include <linux/gpio.h>
#include <linux/delay.h>
#include <linux/of.h>
#include <linux/unistd.h>
#include <linux/platform_device.h>
#include <linux/slab.h>
#include <linux/input.h>
#include <linux/semaphore.h>
#include <linux/kthread.h>
#include <linux/notifier.h>
#include <linux/fb.h>
#include <linux/reboot.h>#include <linux/of_gpio.h>
#include <linux/gpio.h>
#include "aim915916.h"#define DYNAMIC_DETECT_AIM955956 1static struct i2c_client *aim955_client = NULL;
static struct i2c_client *aim956_client = NULL;
#ifdef DYNAMIC_DETECT_AIM955956
struct task_struct *glink_detect_kt = NULL;
static int link_detect_kernel_thread(void *data);
static void link_detect_kernel_thread_cleanup_module(void);
#endif
static int aim955_init_status = -1;	
static int aim956_init_status = -1;
static int reconfig_aim955956_status = -1;int reset_915(void)
{int ret = 0;unsigned char value = 0;unsigned char addr = 0;addr		=		0x01;value		=		0x01;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_RESET\n");return ret;}msleep(100);
}int remote_mode(void)
{int ret = 0;unsigned char value = 0;unsigned char addr = 0;addr		=		0x0a;value		=		0x05;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM956 error: 0x%x 0x%x\n", addr, value);return ret;}addr		=		0x1c;value		=		0x03;if((ret = i2c_smbus_write_byte_data(aim956_client, addr, value)) < 0){printk("I2C_AIM956 error: 0x%x 0x%x\n", addr, value);return ret;}}int reset_mode(int mode)
{int ret = 0;unsigned char value = 0;unsigned char addr = 0;if (aim956_client == NULL) {printk("aim956_client is NULL\n");return -EINVAL;}
//gpio1 RESETif (mode == resetin) {addr = 0x1D;value = 0x53;printk("reset set input\n");} else if (mode == resetoutlow) {addr = 0x1D;value = 0x01;printk("reset set ouput\n");}else if (mode == resetouthigh) {addr = 0x1D;value = 0x09;printk("reset set ouput\n");} else if(mode == intin){//INT input  gpio0addr = 0x1c;value = 0x03;printk("INT set input\n");}else if(mode == intouthigh){// INT outputaddr = 0x1c;value = 0x09;printk("INT set input1\n");}else if(mode == intoutlow){// INT outputaddr = 0x1c;value = 0x01;printk("INT set input1\n");}ret = i2c_smbus_write_byte_data(aim956_client, addr, value);if (ret < 0) {printk("I2C_AIM956 error: addr=0x%x value=0x%x ret=%d\n", addr, value, ret);return ret;}return 0;
}EXPORT_SYMBOL(reset_mode); 
EXPORT_SYMBOL(remote_mode);//#define TIME_DELAY 100int configure_aim956955(void)
{int ret = 0;unsigned char value = 0;unsigned char addr = 0;//第二步 40bitaddr		=		0x42;value		=		0x12;if((ret = i2c_smbus_write_byte_data(aim956_client, addr, value)) < 0){printk("I2C_AIM956 error: 0x%x 0x%x\n", addr, value);return ret;}addr		=		0x6c;value		=		0x12;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM956 error: 0x%x 0x%x\n", addr, value);return ret;}msleep(30);//#第 3 步:955 外设 I2C 地址映射//TP i2caddr,0x14 * 2 = 0x28addr 	=	0x07;value 	= 	0x28;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}addr 	=	0x08;value 	= 	0x28;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}//lightaddr 	=	0x51;value 	= 	0x52;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}addr 	=	0x58;value 	= 	0x52;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}//#ifdef TIME_DELAYmsleep(TIME_DELAY);#endif//printk("step3\n");//第四步 916X Rx/Tx 相关寄存器addr 	=	0x20;value 	= 	0x03;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endifaddr 	=	0x48;value 	= 	0xFF;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endifaddr 	=	0x67;value 	= 	0x37;if((ret = i2c_smbus_write_byte_data(aim956_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endifaddr 	=	0x49;value 	= 	0x3F;if((ret = i2c_smbus_write_byte_data(aim956_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endifaddr 	=	0x5A;value 	= 	0xF0;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endifaddr 	=	0x28;value 	= 	0x04;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endifaddr 	=	0x49;value 	= 	0x3A;if((ret = i2c_smbus_write_byte_data(aim956_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endifaddr 	=	0x49;value 	= 	0x3E;if((ret = i2c_smbus_write_byte_data(aim956_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endifaddr 	=	0x49;value 	= 	0x3F;if((ret = i2c_smbus_write_byte_data(aim956_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endifaddr 	=	0x5A;value 	= 	0xF4;if((ret = i2c_smbus_write_byte_data(aim956_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endifaddr 	=	0x40;value 	= 	0xF8;if((ret = i2c_smbus_write_byte_data(aim956_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endifaddr 	=	0x28;value 	= 	0x00;if((ret = i2c_smbus_write_byte_data(aim956_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endifaddr 	=	0x40;value 	= 	0xF0;if((ret = i2c_smbus_write_byte_data(aim956_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endifaddr 	=	0x67;value 	= 	0x33;if((ret = i2c_smbus_write_byte_data(aim956_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endif//printk ("step 4\n");//第 5 步:配置 915 的 GPIO[3:0]、D_GPIO[3:0]、GPIO[8:5]_reg 至 956 相应 GPIO 的透传//GPIO2 PWM addr 	=	0x0B;value 	= 	0x30;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}addr 	=	0x1D;value 	= 	0x50;if((ret = i2c_smbus_write_byte_data(aim956_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}//printk ("step 5\n");//#第 6 步:配置 915 端接收 916 端输入的中断addr 	=	0x7F;value 	= 	0x21;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endif//#第 7 步:955 完成初始化addr 	=	0x03;value 	= 	0x1A;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endifaddr 	=	0x44;value 	= 	0x16;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM956 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endifaddr 	=	0x6F;value 	= 	0x80;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endifaddr 	=	0x72;value 	= 	0x02;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endifaddr 	=	0x72;value 	= 	0x03;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endifaddr 	=	0x6F;value 	= 	0x00;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endifaddr 	=	0x25;value 	= 	0x07;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endifaddr 	=	0x26;value 	= 	0x00;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endifaddr 	=	0x6A;value 	= 	0xC9;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endifaddr 	=	0x72;value 	= 	0x02;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endifaddr 	=	0x72;value 	= 	0x03;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endifaddr 	=	0x72;value 	= 	0x02;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endifaddr 	=	0x72;value 	= 	0x03;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endifaddr 	=	0x26;value 	= 	0x04;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endifaddr 	=	0x6A;value 	= 	0x01;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endifaddr 	=	0x72;value 	= 	0xFF;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endifaddr 	=	0x23;value 	= 	0x37;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endifaddr 	=	0x25;value 	= 	0x0F;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endifaddr 	=	0x26;value 	= 	0x00;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endifaddr 	=	0x6F;value 	= 	0x80;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endifaddr 	=	0x71;value 	= 	0xBF;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endifaddr 	=	0x72;value 	= 	0xBF;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endifaddr 	=	0x71;value 	= 	0xFF;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endif//addr 	=	0x72;value 	= 	0xFF;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endifaddr 	=	0x72;value 	= 	0xFE;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endifaddr 	=	0x72;value 	= 	0xFF;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endifaddr 	=	0x72;value 	= 	0xFE;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endifaddr 	=	0x72;value 	= 	0xFF;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endifaddr 	=	0x72;value 	= 	0xFE;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endifaddr 	=	0x72;value 	= 	0xFF;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endifaddr 	=	0x72;value 	= 	0xFE;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endifaddr 	=	0x72;value 	= 	0xFF;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endifaddr 	=	0x72;value 	= 	0xFE;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endifaddr 	=	0x72;value 	= 	0xFF;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endifaddr 	=	0x72;value 	= 	0xFE;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endifaddr 	=	0x72;value 	= 	0xFF;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endifaddr 	=	0x72;value 	= 	0xFE;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endifaddr 	=	0x72;value 	= 	0xFF;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endifaddr 	=	0x72;value 	= 	0xFE;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endifaddr 	=	0x72;value 	= 	0xFF;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endifaddr 	=	0x72;value 	= 	0xFE;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);
#endifaddr 	=	0x72;value 	= 	0xFF;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endif//addr 	=	0x26;value 	= 	0x04;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endifaddr 	=	0x6A;value 	= 	0x09;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endifaddr 	=	0x6F;value 	= 	0x00;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endifaddr 	=	0x6A;value 	= 	0x01;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endifaddr 	=	0x23;value 	= 	0x33;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}#ifdef TIME_DELAYmsleep(TIME_DELAY);#endif//iic直通模式
/*	addr 	=	0x03;value 	= 	0x08;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}//addr 	=	0x0d;//value 	= 	0x9e;//if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){//    printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);//    return ret;// }
//add 916X addr 	=	0x03;value 	= 	0x09;if((ret = i2c_smbus_write_byte_data(aim956_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}addr 	=	0x04;value 	= 	0x80;if((ret = i2c_smbus_write_byte_data(aim956_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}
*/printk("AIM955 AIM956 single lvds 20221018 Setup success.\n");return ret;
}int configure_aim955(void)
{int ret = 0;unsigned char value = 0;unsigned char addr = 0;reset_915();//初始化失败,resetmsleep(100);#if 0//第 0 步骤: 初始化 955 之前,先重启设备addr 	=	0x01;value 	= 	0x02;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 reset before kernel driver init: 0x%x 0x%x, ret: %d\n", addr, value, ret);//return ret;}//955 重启过后, 延迟100ms.msleep(100);
#endif//第 1 步:初始化 915 Rx/Tx 相关寄存器addr 	=	0x6A;value 	= 	0x01;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}msleep(1);addr 	=	0x66;value 	= 	0x02;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}msleep(1);/*DES ID*/addr 	=	0xAD;value 	= 	0x02;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}msleep(1);addr 	=	0x06;value 	= 	0x59;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}msleep(1);addr 	=	0x2F;value 	= 	0x05;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}msleep(1);addr 	=	0x2A;value 	= 	0x30;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}msleep(1);addr 	=	0x2C;value 	= 	0x01;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}msleep(1);addr 	=	0x33;value 	= 	0x35;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}msleep(1);addr 	=	0x32;value 	= 	0xA2;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}msleep(1);addr 	=	0x34;value 	= 	0x00;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}msleep(1);addr 	=	0xA3;value 	= 	0x50;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}msleep(1);addr 	=	0x03;value 	= 	0x3A;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 error: 0x%x 0x%x\n", addr, value);return ret;}msleep(1);return ret;
}static unsigned long is_cabled = 0;static ssize_t aim955956_is_link_show(struct device *dev,struct device_attribute *attr, char *buf)
{printk("aim955956_is_link_show ...\n");u8 detect_reg = 0x07;//u8 detect_reg_data = 0;int data = i2c_smbus_read_byte_data(aim956_client, detect_reg);printk("aim - 955 - 956 is_cabled: 0x%x, invert: 0x%x\n", data, (data & 0xff));if((data & 0xff) == 0x19){is_cabled = 1;}else{is_cabled = 0;}return sprintf(buf, "%d\n", is_cabled);
}static ssize_t aim955_probe_status_show(struct device *dev,struct device_attribute *attr, char *buf)
{return sprintf(buf, "%d\n", aim955_init_status);
}static ssize_t aim956_probe_status_show(struct device *dev,struct device_attribute *attr, char *buf)
{return sprintf(buf, "%d\n", aim956_init_status);
}#ifdef DYNAMIC_DETECT_AIM955956
static ssize_t aim956_reconfig_num_show(struct device *dev,struct device_attribute *attr, char *buf)
{return sprintf(buf, "%d\n", reconfig_aim955956_status);
}
#endifstatic DEVICE_ATTR(is_linked, 0664, aim955956_is_link_show,NULL);
static DEVICE_ATTR(955_probe, 0664, aim955_probe_status_show,NULL);
static DEVICE_ATTR(956_probe, 0664, aim956_probe_status_show,NULL);#ifdef DYNAMIC_DETECT_AIM955956
static DEVICE_ATTR(aim955956_reconfig_num, 0664, aim956_reconfig_num_show,NULL);
#endifstatic struct attribute *aim955956_attributes[] = {&dev_attr_is_linked.attr,&dev_attr_955_probe.attr,&dev_attr_956_probe.attr,
#ifdef DYNAMIC_DETECT_AIM955956    &dev_attr_aim955956_reconfig_num.attr,
#endif    NULL
};static const struct attribute_group aim955956_attr_group = {.attrs = aim955956_attributes,
};static int __init aim956_probe(struct i2c_client *client, const struct i2c_device_id *id)
{int ret = 0;aim956_client = client;printk("aim956_probe ... \n");ret = configure_aim956955();aim956_init_status = ret;printk("aim956_probe ... ..., ret = %d\n", ret);#ifdef DYNAMIC_DETECT_AIM955956glink_detect_kt = kthread_create(link_detect_kernel_thread, (void*)aim956_client , "glink_detect_kt");if(!IS_ERR(glink_detect_kt))wake_up_process(glink_detect_kt);else {printk("create glink_detect_kt watchdog thread failed!!\n");glink_detect_kt = 0;}
#endifreturn ret;
}static int aim956_remove(struct i2c_client *client)
{
#ifdef DYNAMIC_DETECT_AIM955956link_detect_kernel_thread_cleanup_module();
#endifreturn 0;
}static const struct i2c_device_id aim956_id[] = {{ "aim956", 0 },{ }
};static const struct of_device_id aim956_match_table[] = {{.compatible = "aimx916",},{ },};static struct i2c_driver aim956_driver = {.driver     = {.name   = "aim956",.owner  = THIS_MODULE,.of_match_table = aim956_match_table,},.probe      = aim956_probe,.remove     = aim956_remove,.id_table   = aim956_id,
};#ifdef DYNAMIC_DETECT_AIM955956int reconfigure_aim955956(void)
{int ret = 0;unsigned char value = 0;unsigned char addr = 0;
#if 1//第 0 步骤: 初始化 955 之前,先重启设备addr 	=	0x01;value 	= 	0x01;if((ret = i2c_smbus_write_byte_data(aim955_client, addr, value)) < 0){printk("I2C_AIM955 reset before kernel driver init: 0x%x 0x%x, ret: %d\n", addr, value, ret);//return ret;}//955 重启过后, 延迟100ms.msleep(100);
#endifreconfig_aim955956_status++;ret = configure_aim955();msleep(10);if (ret < 0)return ret;elseret = configure_aim956955();return ret;
}bool isLinkDetected(struct i2c_client *client)
{u8 detect_reg = 0x67;int data = i2c_smbus_read_byte_data(aim956_client, detect_reg);//printk("isLinkDetected aim - 955 - 956 is_cabled: 0x%x, invert: 0x%x\n", data, (data & 0xff));if((data & 0xff) == 0x33){return true;}else{return false;}
}static void link_detect_kernel_thread_cleanup_module(void)
{  if(glink_detect_kt){  kthread_stop(glink_detect_kt);  glink_detect_kt = NULL;  }  
}  static int link_detect_kernel_thread(void *data)
{struct i2c_client *client = (struct i2c_client *)data;while(!kthread_should_stop()){if(isLinkDetected(client) == true) {// do nothing.} else {printk("----------------link_detect_kernel_thread call reconfigure_aim955956()-------------- \n");reconfig:if(reconfigure_aim955956() < 0){schedule_timeout_interruptible(msecs_to_jiffies(500));goto reconfig;}}schedule_timeout_interruptible(msecs_to_jiffies(1000));}}
#endifstatic int __init aim955_probe(struct i2c_client *client, const struct i2c_device_id *id)
{int ret = 0;aim955_client = client;printk("aim955_probe ... \n");ret = configure_aim955();aim955_init_status = ret;printk("aim955_probe ... ..., ret = %d\n", ret);sysfs_create_group(&aim955_client->dev.kobj,&aim955956_attr_group);return ret;
}static int aim955_remove(struct i2c_client *client)
{sysfs_remove_group(&aim955_client->dev.kobj,&aim955956_attr_group);return 0;
}static const struct i2c_device_id aim955_id[] = {{ "aim955", 0 },{ }
};static const struct of_device_id aim955_match_table[] = {{.compatible = "aimx915",},{ },
};static struct i2c_driver aim955_driver = {.driver     = {.name   = "aim955",.owner  = THIS_MODULE,.of_match_table = aim955_match_table,},.probe      = aim955_probe,.remove     = aim955_remove,.id_table   = aim955_id,};static int __init aim955956_init(void)
{int ret = 0;printk("aim955956_init\n");ret = i2c_add_driver(&aim955_driver);ret = i2c_add_driver(&aim956_driver);return ret;}static void __exit aim955956_exit(void)
{printk("aim955956_exit\n");i2c_del_driver(&aim955_driver);i2c_del_driver(&aim956_driver); 
}MODULE_AUTHOR("xth");
MODULE_DESCRIPTION("aim955-956-xxx Driver");
MODULE_LICENSE("GPL");module_init(aim955956_init);
//subsys_initcall(aim955956_init);module_exit(aim955956_exit);

驱动写的比较简单,大家可自行完善

四、测试

问题1:

写入寄存器测试后,出现图像偏移的情况

原因: 屏配置了 SYNC 模式, RGB芯片输出 DE 模式

解决方案:拆掉R103电阻,使DE悬空后显示正常

问题2:驱动寄存器初始化会失败的情况

915有对应的复位寄存器,在每次初始化915X寄存器之前进行复位,重新写入

添加915复位代码:

I2C重试机制:

修改后反复测试20次未出现I2C初始化失败的情况

热插拔检测:

  1. isLinkDetected 函数:通过I2C读取设备的特定寄存器(0x67),检查返回的数据是否为0x33。如果是,返回true,表示检测到连接;否则返回false

  2. link_detect_kernel_thread_cleanup_module 函数:如果全局线程glink_detect_kt存在,则停止该线程并将其指针置为NULL,用于清理工作。

  3. link_detect_kernel_thread 函数:这是一个内核线程,循环检查链接状态。如果检测到链接,则什么都不做;如果未检测到链接,则调用reconfigure_aim955956函数进行重新配置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/149174.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

通过企业微信群机器人 发送群消息

1、添加群机器人&#xff0c;复制的webhook地址 2、 public static void main(String[] args) { String reqUrl "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key6xdexxxxxxxxxxxxxxxxxxxxxxxxxxx"; String title "填…

FP7208:升压汽车车灯方案 高效稳定的电力支持

前言 近年来随着汽车的不断普及&#xff0c;车灯方面也在不断发展&#xff0c;车灯对于汽车不仅是外观件更是汽车主动安全的重要组成部分。灯光在保证照亮前部道路的同时&#xff0c;还要确保不对对面车辆产生眩目影响。同时需要针对不同路况和不同载荷引起的灯光偏离进行调整&…

入门数据结构JAVA DS——二叉树的介绍 (构建,性质,基本操作等) (1)

前言 二叉树的概念和性质 二叉树的基本概念 二叉树的种类 二叉树的性质 二叉树的构建存储与遍历 存储 构建 遍历 前序遍历 后序遍历 中序遍历 层序遍历 二叉树的基本操作 获取树中结点个数 获取叶子结点个数 获取第K层结点的个数 获取二叉树的高度 检测值为v…

【新书】从零构建大型语言模型,370页pdf

学习如何从零开始创建、训练和调整大型语言模型&#xff08;LLMs&#xff09; 在《从零构建大型语言模型》一书中&#xff0c;畅销书作者塞巴斯蒂安拉什卡&#xff08;Sebastian Raschka**&#xff09;将一步步指导你创建自己的LLM。每个阶段都有清晰的文字、图表和示例解释。…

【Python】生成dataframe的测试样例,用于测试一个或者多个dataframe

我们在处理dataframe测试时&#xff0c;发现&#xff0c;总需要重新构造一个新的dataframe&#xff0c;每次想找个现成的就想抓狂。 所以&#xff0c;为了方便随用随拿&#xff0c;我在这里直接保存一个直接生成dataframe 的方法。 1. 生成一个随机dataframe的方法&#xff1…

1688店铺装修模板1688店铺怎么装修1688装修模板1688店铺装修教程视频1688运营阿里巴巴店铺装修设计阿里店铺首页怎么装修产品分类效果

侧边栏装修效果&#xff0c;代码1688店铺怎么装修1688装修模板1688店铺装修教程视频1688运营阿里巴巴店铺装修设计阿里店铺首页怎么装修 工具是一秒美工助手

食家巷苦豆粉,香得很哟

苦豆粉&#xff0c;它看似普通&#xff0c;却承载着西北的厚重历史与浓郁风情。那一抹淡淡的绿色粉末&#xff0c;蕴含着大自然的馈赠和西北人民的智慧。 苦豆&#xff0c;这种生长在西北土地上的植物&#xff0c;经过精心研磨&#xff0c;变成了细腻的苦豆粉。它的味道独特&am…

python对文件的写入和追加

写入文件 1.打开文件 文件可以是不存在的&#xff0c;不存在就会创建 f open(./test.txt, w, encoding"utf-8")2.写数据到内存中 f.write("你好&#xff0c;世界")3.写到硬盘中 f.flush()#或者 close()有刷新的功能 f.close()整体代码 #打开文件 f …

鲲鹏计算这五年:硬生态基本盘稳住,才能放手进击软生态

文 | 智能相对论 作者 | 叶远风 数智化深入发展、新质生产力成为主旋律的当下&#xff0c;本土计算产业的发展被寄予越来越多的关注和期待。自2019年开启以来&#xff0c;鲲鹏计算产业生态已经整整走过5个年头。 因此&#xff0c;今年华为全联接大会的鲲鹏之夜&#xff0c;在…

还在用windows自带录屏?试试这三款录屏工具

作为一名办公室文员&#xff0c;我经常需要录制电脑屏幕来制作教程或者记录工作流程。在众多的录屏工具中&#xff0c;我尝试了四款不同的录屏工具&#xff0c;包括Windows自带录屏工具。今天&#xff0c;我就来跟大家分享一下我的使用体验&#xff0c;希望能帮助到和我有同样需…

在视频上绘制区域:使用Vue和JavaScript实现交互式画布

在数字时代&#xff0c;交互式媒体内容的创建和消费变得越来越普遍。特别是视频内容&#xff0c;它不仅提供了视觉信息&#xff0c;还允许用户与之互动&#xff0c;从而增强了用户体验。本文将介绍如何使用Vue.js框架和JavaScript创建一个交互式组件&#xff0c;该组件允许用户…

谷歌老户的优势及优化策略,增加曝光度方法介绍

谷歌老户&#xff08;已存在一段时间并积累了历史数据的账户&#xff09;通常具有较高的权重和稳定性&#xff0c;这使其在投放广告时可以更快速地增加流量并保持稳定的表现。以下是一些策略和建议&#xff0c;帮助您最大化利用谷歌老户的优势。 一、它的优势&#xff1a; 账…

Cherry Studio:开启AI智能工作的新篇章

引言 在当今快速发展的科技时代&#xff0c;如何高效利用人工智能技术提升工作效率&#xff0c;成为了各行各业专业人士的共同追求。&#x1f352; Cherry Studio 正是为此而生&#xff0c;它是一款支持多模型服务的桌面客户端&#xff0c;内置了超过 30 个行业的智能助手&…

MDS130-16-ASEMI充电桩专用MDS130-16

编辑&#xff1a;ll MDS130-16-ASEMI充电桩专用MDS130-16 型号&#xff1a;MDS130-16 品牌&#xff1a;ASEMI 封装&#xff1a;DXT-5 批号&#xff1a;2024 现货&#xff1a;50000 最大重复峰值反向电压&#xff1a;1600V 最大正向平均整流电流(Vdss)&#xff1a;130A …

VOC2007数据集

目标检测入门code 文件目录 下载数据集——在官网下载VOC2007数据集 下载训练数据集 TRAIN data 下载测试数据集 TEST data 解压数据集 解压——训练数据集&#xff0c;在服务器上&#xff0c;目录为VOCdevkit 部分文件目录 全部文件总目录 解压——测试数据集 &#xff08;…

828华为云征文|云服务器Flexus X实例评测体验之搭建MySQL数据库

全文目录&#xff1a; 一、前言二、Flexus X云服务器2.1 Flexus X实例概述2.2 为什么选择 Flexus X实例&#xff1f; 三、购选及登录教程3.1 如何选购Flexus X&#xff1f;3.2 登录方式选择 四、安装 MySQL4.1 安装MySQL依赖库4.2 下载MySQL安装包4.3 上传MySQL安装包4.4 解压M…

3D 模型GLTF、GLB格式文件介绍使用

一、介绍 GLTF&#xff08;GL Transmission Format&#xff09;和 GLB&#xff08;GL Binary&#xff09;是用于在 Web 和各种应用程序中传输和加载 3D 场景和模型的开放标准格式。它们由 Khronos Group 开发&#xff0c;旨在提供一种高效、可扩展且易于使用的 3D 内容格式。以…

CCRC-DSA数据安全评估师:数据安全架构是什么?

架构不仅是抽象的概念&#xff0c;更是项目规划、系统开发、产品部署和安全增强中必不可少的思维模式、沟通桥梁和共享语言。 简言之&#xff0c;它定义了系统中包含的元素及其相互关系&#xff0c;这些元素被称为组件或逻辑模块。 例如&#xff0c;“组件”指独立存在的基础…

matlab之数据处理:滑动平均滤波算法与五点三次平滑算法

关注微♥公众号&#xff1a;“电击小子程高兴的MATLAB小屋”获取专属优惠 一.滑动平均滤波算法 算数平均滤波需要多次采样后才能得出一个有效值&#xff0c;如果被检测量变化较快&#xff0c;多次采样后才输出一次有效值&#xff0c;表现就是系统反应迟钝。将当前采样值与之前…

java后端字节一面

1. 我现在和你进行视频通话&#xff0c;这个是怎么做的&#xff1f; 视频通话通常基于实时通信技术&#xff08;RTC&#xff09;&#xff0c;如WebRTC。它利用现代浏览器的API来实现视频、音频和数据的直接P2P&#xff08;点对点&#xff09;通信&#xff0c;或通过服务器中转。…