RK3568平台 LT9211转接芯片调试笔记

一.简介

龙讯LT9211是一个高性能转换器,支持MIPI LVDS TTL两两之间转换。

使用此款芯片大部分为MIPI与LVDS进行互相转换。

下图为LT9211的典型应用图:

二.LT9211原理图

三.车载显示器和摄像头系统

四.调试LT9211输出 MIPI数据

(1)insmod加载ko文件后,ls /dev 查看是否生成新的video节点。

->如果没有生成video节点,查看ko是否加载失败,dts配置是否正确。

(2)查看设备是否成功挂载在IIC上

->i2cdetect -r -y 5 (lt9211在iic1上地址为ox2b)。

(3)查看LT9211_ChipID寄存器值


void LT9211_ChipID(void)
{lt8918_write_reg(0xff,0x81);//register bankpr_info("\r\nLT9211 Chip ID:%x,",lt8918_read_reg(0x00));//18pr_info("%x, ",lt8918_read_reg(0x01));//1pr_info("%x, ",lt8918_read_reg(0x02));//e4
}

(4)检查LT9211打印log

hfp,hbp,hsync,vfp,vbp,vysnc输出正确。

(5)测量mipi信号

MIPI data :1.8V的方波。

图像数据在soc mipi接收过程是需要检测到各个lane的LP11-LP10-LP00的一个状态切换后才会切换

到高速模式准备接收。

(6)确认mipi lane数与硬件连接的是否一致。

五.LT9211MCU程序

/******************************************************************************* @project: LT9211* @file: lt9211.c* @author: zll* @company: LONTIUM COPYRIGHT and CONFIDENTIAL* @date: 2019.04.10
/******************************************************************************/#include	"include.h"u16 hact, vact;
u16 hs, vs;
u16 hbp, vbp;
u16 htotal, vtotal;
u16 hfp, vfp;
u8 VideoFormat=0;
u32 lvds_clk_in = 0;#define OFFSET 5struct video_timing *pVideo_Format;//hfp, hs, hbp, hact, htotal, vfp, vs, vbp, vact, vtotal, pixclk
struct video_timing video_640x480_60Hz     ={ 8, 96,  40, 640,   800, 33,  2,  10, 480,   525,  25000};
struct video_timing video_720x480_60Hz     ={16, 62,  60, 720,   858,  9,  6,  30, 480,   525,  27000};
struct video_timing video_1280x720_60Hz    ={110,40, 220,1280,  1650,  5,  5,  20, 720,   750,  74250};
struct video_timing video_1280x720_30Hz    ={110,40, 220,1280,  1650,  5,  5,  20, 720,   750,  74250};
struct video_timing video_1366x768_60Hz    ={26, 110,110,1366,  1592,  13, 6,  13, 768,   800,  81000};
struct video_timing video_1920x720_60Hz    ={148,44, 88, 1920,  2200, 28,  5,  12, 720,   765,  88000};
struct video_timing video_1920x1080_30Hz   ={88, 44, 148,1920,  2200,  4,  5,  36, 1080, 1125,  74250};
struct video_timing video_1920x1080_60Hz   ={88, 44, 148,1920,  2200,  4,  5,  36, 1080, 1125, 148500};
struct video_timing video_1920x1200_60Hz   ={48, 32,  80,1920,  2080,  3,  6,  26, 1200, 1235, 154000};
struct video_timing video_3840x2160_30Hz   ={176,88, 296,3840,  4400,  8,  10, 72, 2160, 2250, 297000};void LT9211_ChipID(void)
{HDMI_WriteI2C_Byte(0xff,0x81);//register bankprint("\r\nLT9211 Chip ID:%x,",HDMI_ReadI2C_Byte(0x00));print("%x,",HDMI_ReadI2C_Byte(0x01));print("%x",HDMI_ReadI2C_Byte(0x02));
}/** video chk soft rst **/
void lt9211_vid_chk_rst(void)       
{HDMI_WriteI2C_Byte(0xff,0x81);	  HDMI_WriteI2C_Byte(0x10,0xbe); Timer0_Delay1ms(10);HDMI_WriteI2C_Byte(0x10,0xfe); 
}/** lvds rx logic rst **/
void lt9211_lvdsrx_logic_rst(void)       
{HDMI_WriteI2C_Byte(0xff,0x81);	   HDMI_WriteI2C_Byte(0x0c,0xeb);Timer0_Delay1ms(10);HDMI_WriteI2C_Byte(0x0c,0xfb);
}void LT9211_SystemInt(void)
{/* system clock init */		   HDMI_WriteI2C_Byte(0xff,0x82);HDMI_WriteI2C_Byte(0x01,0x18);HDMI_WriteI2C_Byte(0xff,0x86);HDMI_WriteI2C_Byte(0x06,0x61); 	HDMI_WriteI2C_Byte(0x07,0xa8); //fm for sys_clkHDMI_WriteI2C_Byte(0xff,0x87); //  ʼ   txpll  Ĵ    б Ĭ  ֵ      HDMI_WriteI2C_Byte(0x14,0x08); //default valueHDMI_WriteI2C_Byte(0x15,0x00); //default valueHDMI_WriteI2C_Byte(0x18,0x0f);HDMI_WriteI2C_Byte(0x22,0x08); //default valueHDMI_WriteI2C_Byte(0x23,0x00); //default valueHDMI_WriteI2C_Byte(0x26,0x0f); 
}void LT9211_LvdsRxPhy(void)
{#ifdef INPUT_PORTAprint("\r\nPort A PHY Config");HDMI_WriteI2C_Byte(0xff,0x82);HDMI_WriteI2C_Byte(0x02,0x8B);   //Port A LVDS mode enableHDMI_WriteI2C_Byte(0x05,0x21);   //port A CLK lane swapHDMI_WriteI2C_Byte(0x07,0x1f);   //port A clk enableHDMI_WriteI2C_Byte(0x04,0xa0);   //select port A clk as byteclk//HDMI_WriteI2C_Byte(0x09,0xFC); //port A P/N swapHDMI_WriteI2C_Byte(0xff,0x86);		HDMI_WriteI2C_Byte(0x33,0xe4);   //Port A Lane swap#endif#ifdef INPUT_PORTBprint("\r\nPort B PHY Config");HDMI_WriteI2C_Byte(0xff,0x82);HDMI_WriteI2C_Byte(0x02,0x88);   //Port A/B LVDS mode enableHDMI_WriteI2C_Byte(0x05,0x21);   //port A CLK lane swap and rterm turn-offHDMI_WriteI2C_Byte(0x0d,0x21);   //port B CLK lane swapHDMI_WriteI2C_Byte(0x07,0x1f);   //port A clk enable  (ֻ  Portbʱ,porta  lane0 clkҪ  )HDMI_WriteI2C_Byte(0x0f,0x1f);   //port B clk enable//HDMI_WriteI2C_Byte(0x10,0x00);   //select port B clk as byteclkHDMI_WriteI2C_Byte(0x04,0xa1);   //reserve//HDMI_WriteI2C_Byte(0x11,0x01);   //port B P/N swapHDMI_WriteI2C_Byte(0x10,0xfc);HDMI_WriteI2C_Byte(0xff,0x86);		HDMI_WriteI2C_Byte(0x34,0xe4);   //Port B Lane swapHDMI_WriteI2C_Byte(0xff,0xd8);		HDMI_WriteI2C_Byte(0x16,0x80);#endifHDMI_WriteI2C_Byte(0xff,0x81);HDMI_WriteI2C_Byte(0x20,0x7f); 	HDMI_WriteI2C_Byte(0x20,0xff);  //mlrx calib reset
}void LT9211_LvdsRxDigital(void)
{	  HDMI_WriteI2C_Byte(0xff,0x85);HDMI_WriteI2C_Byte(0x88,0x10);      //LVDS input, MIPI outputHDMI_WriteI2C_Byte(0xff,0xd8);if(INPUT_PORT_NUM == 1)             //1Port LVDS Input{HDMI_WriteI2C_Byte(0x10,0x80);print("\r\nLVDS Port Num: 1");}else if(INPUT_PORT_NUM == 2)        //2Port LVDS Input{HDMI_WriteI2C_Byte(0x10,0x00);print("\r\nLVDS Port Num: 2");}else{print("\r\nPort Num Set Error");} 	lt9211_vid_chk_rst();              //video chk soft rstlt9211_lvdsrx_logic_rst();         //lvds rx logic rst		HDMI_WriteI2C_Byte(0xff,0x86);HDMI_WriteI2C_Byte(0x30,0x45);     //port AB input port sel	 if(LVDS_FORMAT == JEDIA_FORMAT){HDMI_WriteI2C_Byte(0xff,0x85);HDMI_WriteI2C_Byte(0x59,0xd0); 	HDMI_WriteI2C_Byte(0xff,0xd8);HDMI_WriteI2C_Byte(0x11,0x40);}
}int lt9211_lvds_clkstb_check(void)
{u8 porta_clk_state = 0;u8 portb_clk_state = 0;HDMI_WriteI2C_Byte(0xff,0x86);HDMI_WriteI2C_Byte(0x00,0x01);Timer0_Delay1ms(300);porta_clk_state = (HDMI_ReadI2C_Byte(0x08) & (0x20));HDMI_WriteI2C_Byte(0xff,0x86);HDMI_WriteI2C_Byte(0x00,0x02);Timer0_Delay1ms(300);portb_clk_state = (HDMI_ReadI2C_Byte(0x08) & (0x20));if(INPUT_PORT_NUM == 1){#ifdef INPUT_PORTAif( porta_clk_state ){return 1;}else{return 0;}#endif#ifdef INPUT_PORTBif( portb_clk_state ){return 1;}else{return 0;}#endif}else if(INPUT_PORT_NUM == 2){if(porta_clk_state && portb_clk_state){return 1;}else{return 0;}}
}void LT9211_ClockCheckDebug(void)
{
#ifdef _uart_debug_u32 fm_value;lvds_clk_in = 0;#ifdef INPUT_PORTAHDMI_WriteI2C_Byte(0xff,0x86);HDMI_WriteI2C_Byte(0x00,0x01);Timer0_Delay1ms(50);fm_value = 0;fm_value = (HDMI_ReadI2C_Byte(0x08) &(0x0f));fm_value = (fm_value<<8) ;fm_value = fm_value + HDMI_ReadI2C_Byte(0x09);fm_value = (fm_value<<8) ;fm_value = fm_value + HDMI_ReadI2C_Byte(0x0a);print("\r\nPort A lvds clock: ");printdec_u32(fm_value);lvds_clk_in = fm_value;#endif#ifdef INPUT_PORTBHDMI_WriteI2C_Byte(0xff,0x86);HDMI_WriteI2C_Byte(0x00,0x02);Timer0_Delay1ms(50);fm_value = 0;fm_value = (HDMI_ReadI2C_Byte(0x08) &(0x0f));fm_value = (fm_value<<8) ;fm_value = fm_value + HDMI_ReadI2C_Byte(0x09);fm_value = (fm_value<<8) ;fm_value = fm_value + HDMI_ReadI2C_Byte(0x0a);print("\r\nPort B lvds clock: ");printdec_u32(fm_value);lvds_clk_in = fm_value;#endif#endif
}void LT9211_LvdsRxPll(void)
{u8 loopx = 0;HDMI_WriteI2C_Byte(0xff,0x82);HDMI_WriteI2C_Byte(0x25,0x05);HDMI_WriteI2C_Byte(0x27,0x02);	if(INPUT_PORT_NUM == 1)             //1Port LVDS Input{HDMI_WriteI2C_Byte(0x24,0x24); //RXPLL_LVDSCLK_MUXSEL,PIXCLK_MUXSEL	0x2c.HDMI_WriteI2C_Byte(0x28,0x44); //0x64}else if(INPUT_PORT_NUM == 2)        //2Port LVDS Input{HDMI_WriteI2C_Byte(0x24,0x2c); //RXPLL_LVDSCLK_MUXSEL,PIXCLK_MUXSEL	0x2c.HDMI_WriteI2C_Byte(0x28,0x64); //0x64}else{print("\r\n LvdsRxPll: lvds port count error");}Timer0_Delay1ms(10);HDMI_WriteI2C_Byte(0xff,0x87);HDMI_WriteI2C_Byte(0x05,0x00);HDMI_WriteI2C_Byte(0x05,0x80);Timer0_Delay1ms(100);for(loopx = 0; loopx < 10; loopx++) //Check Rx PLL cal{HDMI_WriteI2C_Byte(0xff,0x87);			if(HDMI_ReadI2C_Byte(0x12)& 0x80){if(HDMI_ReadI2C_Byte(0x11)& 0x80){print("\r\nLT9211 rx cal done");}else{print("\r\nLT9211 rx cal undone!!");}					print("\r\nLT9211 rx pll lock");break;}else{print("\r\nLT9211 rx pll unlocked");}}
}void LT9211_VideoCheck(void)
{u8 sync_polarity;HDMI_WriteI2C_Byte(0xff,0x86);HDMI_WriteI2C_Byte(0x20,0x00);sync_polarity = HDMI_ReadI2C_Byte(0x70);vs = HDMI_ReadI2C_Byte(0x71);hs = HDMI_ReadI2C_Byte(0x72);hs = (hs<<8) + HDMI_ReadI2C_Byte(0x73);vbp = HDMI_ReadI2C_Byte(0x74);vfp = HDMI_ReadI2C_Byte(0x75);hbp = HDMI_ReadI2C_Byte(0x76);hbp = (hbp<<8) + HDMI_ReadI2C_Byte(0x77);hfp = HDMI_ReadI2C_Byte(0x78);hfp = (hfp<<8) + HDMI_ReadI2C_Byte(0x79);vtotal = HDMI_ReadI2C_Byte(0x7A);vtotal = (vtotal<<8) + HDMI_ReadI2C_Byte(0x7B);htotal = HDMI_ReadI2C_Byte(0x7C);htotal = (htotal<<8) + HDMI_ReadI2C_Byte(0x7D);vact = HDMI_ReadI2C_Byte(0x7E);vact = (vact<<8)+ HDMI_ReadI2C_Byte(0x7F);hact = HDMI_ReadI2C_Byte(0x80);hact = (hact<<8) + HDMI_ReadI2C_Byte(0x81);print("\r\nsync_polarity = %x", sync_polarity);if(!(sync_polarity & 0x01)) //hsync{HDMI_WriteI2C_Byte(0xff,0xd8);HDMI_WriteI2C_Byte(0x10, (HDMI_ReadI2C_Byte(0x10)| 0x10));}if(!(sync_polarity & 0x02)) //vsync{HDMI_WriteI2C_Byte(0xff,0xd8);HDMI_WriteI2C_Byte(0x10, (HDMI_ReadI2C_Byte(0x10)| 0x20));}print("\r\nhfp, hs, hbp, hact, htotal = ");printdec_u32(hfp);printdec_u32(hs);printdec_u32(hbp);printdec_u32(hact);printdec_u32(htotal);print("\r\nvfp, vs, vbp, vact, vtotal = ");printdec_u32(vfp);printdec_u32(vs);printdec_u32(vbp);printdec_u32(vact);printdec_u32(vtotal);if ((hact == video_1280x720_60Hz.hact ) &&( vact == video_1280x720_60Hz.vact )){print("\r\nvideo_1280x720_60Hz"); pVideo_Format = &video_1280x720_60Hz;}else if ((hact == video_1920x1080_60Hz.hact ) &&( vact == video_1920x1080_60Hz.vact )){print("\r\nvideo_1920x1080_60Hz"); pVideo_Format = &video_1920x1080_60Hz;}else {pVideo_Format = NULL;print("\r\nvideo_none"); }
}void LT9211_MipiTxpll(void)
{u8 loopx;HDMI_WriteI2C_Byte(0xff,0x82);HDMI_WriteI2C_Byte(0x36,0x03); //b7:txpll_pdHDMI_WriteI2C_Byte(0x37,0x28);HDMI_WriteI2C_Byte(0x38,0x44);HDMI_WriteI2C_Byte(0x3a,0x93);HDMI_WriteI2C_Byte(0xff,0x87);HDMI_WriteI2C_Byte(0x13,0x00);HDMI_WriteI2C_Byte(0x13,0x80);Timer0_Delay1ms(100);for(loopx = 0; loopx < 10; loopx++) //Check Tx PLL cal done{HDMI_WriteI2C_Byte(0xff,0x87);			if(HDMI_ReadI2C_Byte(0x1f)& 0x80){if(HDMI_ReadI2C_Byte(0x20)& 0x80){print("\r\nLT9211 tx pll lock");}else{print("\r\nLT9211 tx pll unlocked");}					print("\r\nLT9211 tx pll cal done");break;}else{print("\r\nLT9211 tx pll unlocked");}}	 			
}void LT9211_MipiTxPhy(void)
{		HDMI_WriteI2C_Byte(0xff,0x82);HDMI_WriteI2C_Byte(0x62,0x00); //ttl output disableHDMI_WriteI2C_Byte(0x3b,0x32); //mipi en	HDMI_WriteI2C_Byte(0xff,0x81);HDMI_WriteI2C_Byte(0x20,0xfb);Timer0_Delay1ms(10);HDMI_WriteI2C_Byte(0x20,0xff);   //tx rterm calibration//HDMI_WriteI2C_Byte(0x48,0x5f); //Port A Lane P/N Swap//HDMI_WriteI2C_Byte(0x49,0x92); //HDMI_WriteI2C_Byte(0x52,0x5f); //Port B Lane P/N Swap//HDMI_WriteI2C_Byte(0x53,0x92); HDMI_WriteI2C_Byte(0xff,0x86);	HDMI_WriteI2C_Byte(0x40,0x80); //tx_src_sel/*port src sel*/HDMI_WriteI2C_Byte(0x41,0x01);	HDMI_WriteI2C_Byte(0x42,0x23);HDMI_WriteI2C_Byte(0x43,0x40); //Port A MIPI Lane SwapHDMI_WriteI2C_Byte(0x44,0x12);HDMI_WriteI2C_Byte(0x45,0x34); //Port B MIPI Lane Swap
}void LT9211_MipiTxDigital(void)
{	HDMI_WriteI2C_Byte(0xff,0xd4);HDMI_WriteI2C_Byte(0x1c,0x30);  //hs_rqst_preHDMI_WriteI2C_Byte(0x1d,0x0a);  //lpxHDMI_WriteI2C_Byte(0x1e,0x06);  //prprHDMI_WriteI2C_Byte(0x1f,0x0a);  //trailHDMI_WriteI2C_Byte(0x21,0x00);  //[5]byte_swap,[0]burst_clkHDMI_WriteI2C_Byte(0xff,0xd4);	HDMI_WriteI2C_Byte(0x12,0x1E);HDMI_WriteI2C_Byte(0x15,0x01);HDMI_WriteI2C_Byte(0x16,0x55);	HDMI_WriteI2C_Byte(0x10,0x01);HDMI_WriteI2C_Byte(0x11,0x50); //read byteclkHDMI_WriteI2C_Byte(0x13,0x0f);	//bit[5:4]:lane num, bit[2]:bllp,bit[1:0]:vid_modeHDMI_WriteI2C_Byte(0x14,0x04); //bit[5:4]:data typ,bit[2:0]:fmt sel 000:rgb888HDMI_WriteI2C_Byte(0x21,0x02);HDMI_WriteI2C_Byte(0xff,0xd0);HDMI_WriteI2C_Byte(0x04,0x10);
}void LT9211_SetTxTiming(void)
{u16 hact, vact;u16 hs, vs;u16 hbp, vbp;u16 htotal, vtotal;u16 hfp, vfp;	hact = pVideo_Format->hact;vact = pVideo_Format->vact;htotal = pVideo_Format->htotal;vtotal = pVideo_Format->vtotal;hs = pVideo_Format->hs;vs = pVideo_Format->vs;hfp = pVideo_Format->hfp;vfp = pVideo_Format->vfp; hbp = pVideo_Format->hbp;vbp = pVideo_Format->vbp;HDMI_WriteI2C_Byte(0xff,0xd4);HDMI_WriteI2C_Byte(0x04,0x01); //hs[7:0] not careHDMI_WriteI2C_Byte(0x05,0x01); //hbp[7:0] not careHDMI_WriteI2C_Byte(0x06,0x01); //hfp[7:0] not careHDMI_WriteI2C_Byte(0x07,(u8)(hact>>8)); //hactive[15:8]HDMI_WriteI2C_Byte(0x08,(u8)(hact)); //hactive[7:0]HDMI_WriteI2C_Byte(0x09,(u8)(vs)+(u8)(vbp) - 1); //vfp[7:0]HDMI_WriteI2C_Byte(0x0a,0x00); //bit[3:0]:vbp[11:8]HDMI_WriteI2C_Byte(0x0b,0x01); //vbp[7:0]HDMI_WriteI2C_Byte(0x0c,(u8)(vact>>8)); //vcat[15:8]HDMI_WriteI2C_Byte(0x0d,(u8)(vact)); //vcat[7:0]HDMI_WriteI2C_Byte(0x0e,0x00); //vfp[11:8]HDMI_WriteI2C_Byte(0x0f,0x00); //vfp[7:0]
}void LT9211_LVDS2MIPIDSI_Config(void)
{print("\r\n*************LT9211 LVDS2MIPIDSI Config*************");LT9211_ChipID();LT9211_SystemInt();LT9211_LvdsRxPhy();LT9211_LvdsRxDigital();LT9211_LvdsRxPll();LT9211_ClockCheckDebug();LT9211_VideoCheck();if( pVideo_Format != NULL ){/********MIPI OUTPUT CONFIG********/LT9211_MipiTxPhy();LT9211_MipiTxpll();LT9211_SetTxTiming();LT9211_MipiTxDigital();}
}
/******************************************************************************* @project: LT9211* @file: lt9211.h* @author: zll* @company: LONTIUM COPYRIGHT and CONFIDENTIAL* @date: 2019.04.10
/******************************************************************************/#ifndef _LT9211_H
#define _LT9211_H/******************* LVDS Input Config ********************/
#define INPUT_PORTA
#define INPUT_PORTB#define INPUT_PORT_NUM 2typedef enum LVDS_FORMAT_ENUM{VESA_FORMAT = 0,JEDIA_FORMAT
};
#define LVDS_FORMAT VESA_FORMATtypedef enum LVDS_MODE_ENUM{DE_MODE = 0,SYNC_MODE
};
#define LVDS_MODE SYNC_MODEtypedef struct video_timing{
u16 hfp;
u16 hs;
u16 hbp;
u16 hact;
u16 htotal;
u16 vfp;
u16 vs;
u16 vbp;
u16 vact;
u16 vtotal;
u32 pclk_khz;
};void LT9211_LVDS2MIPIDSI_Config(void);#endif

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

web系统设计安全性基本要求

接口设计安全 身份鉴别 独立的登录模块&#xff1a;为社会用户和平台运营管理用户提供独立的登录地址、登录界面和身份认证模块&#xff0c;通过防火墙等设备严格限制能够登录WEB应用的用户地址、身份&#xff1b; 双因素认证&#xff1a; 平台运营管理人员&#xff1a;采用用…

Civil 3D安装教程,免费使用,带安装包和工具,一分钟轻松搞的安装

前言 Civil 3D是一款面向基础设施行业的建筑信息模型&#xff08;BIM&#xff09;解决方案。它为基础设施行业的各类技术人员提供了强大的设计、分析以及文档编制功能&#xff0c;广泛适用于勘察测绘、岩土工程、交通运输、水利水电、市政给排水、城市规划和总图设计等众多领域…

MySQL(五)——多表查询

上期文章 MySQL&#xff08;四&#xff09;——约束 文章目录 上期文章多表关系一对多&#xff08;多对一&#xff09;多对多多表外键关系可视化一对一 多表查询概述笛卡尔积多表查询分类连接查询 内连接隐式内连接显式内连接 外连接左外连接右外连接 自连接联合查询 union&am…

Android Framework | AOSP源码下载及编译指南(基于Android13)

Android Framework | AOSP源码下载及编译指南(基于Android13) 引言 AOSP&#xff08;Android Open Source Project&#xff09;是Android操作系统的开源项目&#xff0c;通过下载和编译AOSP源码&#xff0c;您可以获得原始的Android系统&#xff0c;并进行定制和开发。本教程…

【C++】—— C++的IO流

在C中&#xff0c;I/O流是一项关键的编程概念&#xff0c;为程序提供了与外部世界进行交互的重要手段。通过使用C的强大I/O库&#xff0c;开发者能够实现对标准输入输出、文件、字符串等多种数据源的高效处理。接下来让我们深入探讨C的I/O流&#xff0c;了解其基本原理、常见操…

浏览器插件:WebScraper基本用法和抓取页面内容(不会编程也能爬取数据)

Web Scraper 是一个浏览器扩展&#xff0c;用于从页面中提取数据(网页爬虫)。对于简单或偶然的需求非常有用&#xff0c;例如正在写代码缺少一些示例数据&#xff0c;使用此插件可以很快从类似的网站提取内容作为模拟数据。从 Chrome 的插件市场安装后&#xff0c;页面 F12 打开…

RT-Thread experimental 代码学习(1)thread_sample

RTOS的最基础功能是线程。 线程的调度是如何工作的&#xff1f;RT-thread官方的实验文档是最好的参考。 老规矩&#xff0c;先放法国人doxygen。 thread_sample 代码的调用关系图 有意思的是&#xff0c;RT有两种创建线程的方式 - 静态和动态&#xff0c;粗略的理解是&…

微信小程序之WXML 模板语法之数据绑定、事件绑定、wx:if和列表渲染

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

数字图像处理期末速成笔记

目录 一、基础知识二、相邻像素间基本关系三、图像增强方法1、直方图求解2、直方图均衡化3、直方图规定化4、图像平滑5、邻域平均法&#xff08;线性&#xff09;6、 中值滤波法&#xff08;分线性&#xff09;7、中值滤波与领域平均的异同8、4-邻域平滑法9、超限像素平滑法10、…

我们应该了解的⽤户画像

当我们谈⽤户画像时&#xff0c;到底在谈什么 对于互联⽹公司来说&#xff0c;企业的增⻓、内容、活动、产品等⼯作基本上都是围绕着“⽤户”来做的&#xff0c;可以说都是在做“⽤户运营”这个⼯作&#xff0c;⽽⽤户画像是⽤户运营⼯作中⾮常重要的⼀环 ⽤户画像的主要特征是…

【js】js 异步机制详解 Generator / Async / Promise

三种语法功能放在一起&#xff0c;是因为他们都有相似特点&#xff1a; 维护某种状态在未来恢复状态并执行 本文重点回答以下几个问题&#xff1a; 为什么 Generator 和 Async 函数的 代码执行流 都可以简化成树形结构&#xff1f;async 函数为什么返回一个 promise&#xf…

Cloudreve存储策略-通过从机存储来拓展容量

Sham的云服务器是搬瓦工最低低低配的&#xff0c;1H 0.5G不说&#xff0c;硬盘容量也只有10g&#xff0c;说实话&#xff0c;装了宝塔面板和服务器套件后&#xff0c;基本满了&#xff0c;这时又想在云服务器上打个网盘用于下载、存储&#xff0c;这时就需要拓展硬盘&#xff0…

【podman】podman学习

Podman 官网 快速开始 面向 Docker 用户的 Podman 和 Buildah Podman是一个开源的容器、pod和容器映像管理引擎。Podman使查找、运行、构建和共享容器变得容易。 Podman Desktop是Podman的图形应用程序&#xff0c;使其易于在Windows、MacOS和Linux上安装和使用Podman&…

烟火检测AI边缘计算智能分析网关V4如何通过ssh进行服务器远程运维

智能分析网关V4是一款高性能、低功耗的AI边缘计算硬件设备&#xff0c;它采用了BM1684芯片&#xff0c;集成高性能8核ARM A53&#xff0c;主频高达2.3GHz&#xff0c;并且INT8峰值算力高达17.6Tops&#xff0c;FB32高精度算力达到2.2T&#xff0c;每个摄像头可同时配置3种算法&…

Fiddler基础使用指南

1. Fiddler介绍 Fiddler 是一款抓包工具&#xff0c;可以将网络传输发送与接受的数据包进行截获、重发、编辑、转存等操作&#xff0c;也可以用来检测网络安全 2. 设置过滤 通过设置过滤条件&#xff0c;可以使抓包工具过滤掉非目标包 3. 删除数据 被抓取的包可以进行手动删除 …

使用aspera下载SRA数据速度高达 下载中国gsa数据? ascp

转载自&#xff1a;秘籍 | 惊了&#xff0c;使用aspera下载SRA数据速度高达 291Mb/s - 简书 一、安装Aspera Connect 安装Linux版的Aspera Connect # 上面链接是最新版&#xff0c;因此下载的时候去官网复制最新的链接地址下载&#xff0c;否则可能会报错 wget https://d3gcli…

54 C++ 多线程 条件变量 condition_variable,wait(),notify_one()

一 前提&#xff1a;之前代码的缺陷 在前面我们使用两个线程 &#xff0c;一个线程读&#xff0c;一个线程写来完成对于共享数据访问。 我们把这个代码 先放在这里&#xff0c;方便回忆&#xff0c;然后说明代码可能存在的问题&#xff0c;然后改动。 class Teacher174 { pri…

Elasticsearch Index Shard Allocation 索引分片分配策略

Elasticsearch 索引分片的分配策略说明 在上一篇《索引生命周期管理ILM看完不懂你锤我 》&#xff08;https://mp.weixin.qq.com/s/ajhFp-xBU1dJm8a1dDdRQQ&#xff09;中&#xff0c;我们已经学会了索引级别的分片分配过滤属性&#xff0c;也就是在配置文件中指定当前节点的属…

牛客刷题之字符串

文章目录 字符串的长度(len)字符串的大小写删除字符串的指定字符字符串的重复输出&#xff08;不用循环语句&#xff09;字符的指定长度的输出&#xff08;切片&#xff09;字符串分隔 字符串的长度(len) str input()print(len(str))字符串的大小写 upper()全部大写 , lower()…

基于JavaWeb+SSM+Vue基于微信小程序的网上商城系统的设计和实现

基于JavaWebSSMVue基于微信小程序的网上商城系统的设计和实现 滑到文末获取源码Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 滑到文末获取源码 Lun文目录 目录 1系统概述 1 1.1 研究背景 1 1.2研究目的 1 1.3系统设计思想…