如何验证MTK的win7触摸屏点位校准与LCM的点是否对应

1、Linux设备模型
站在BSP的角度来看,整个系统可以由三部分组成:设备、总线、驱动。
Linux kernel有一些总线,比如USB、I2C等。对于每一个总线都会有一些设备和驱动挂在上面。驱动服务于匹配的设备,使Linux正确的操作硬件设备。当一个设备或者驱动注册到特定的总线上的时候就会触发总线匹配函数,比如一个设备注册到了总线,所有的该总线的驱动都会被枚举,判断是不是可以服务于新添加的设备(一般通过name来匹配),反之亦然。
如果总线匹配成功,就会调用驱动的probe函数,检查指定的硬件确实存在,然后确定是否所需的资源都能够从系统申请。
事实上,设备或者驱动能够正确的合作,在probe之后,模块初始化顺序决定于probe的执行顺序,可以由BSP函数中注册设备的顺序控制。MT6572平台,L版本的BSP文件放在kernel/arch/arm/mach-mt6572/mt_devs.c,mt_board_init()函数控制着probe的顺序。
2、LCM设备模型
对于方案公司的驱动开发人员来说,对于LCM的工作主要是在Mediatek的代码架构下进行兼容和优化。和其他的所有的模块一样,Mediatek的软件架构尽可能的把所有的无需客制化的代码划分出来,从而减少对下游开发人员的工作量。
Mediatek封装了一个结构体给开发人员,包含了所有可能需要克制化的函数指针,对于不同的IC,只需要对应实现相应的函数就可以了。
LCM_DRIVER 结构体的各个成员的介绍如下:
在LCM_UTIL_FUNCS这个类型中,主要定义了一些接口函数,这些接口函数是mtk提供给lcm驱动开发者使用的;
lcm_compare_id函数中主要是通过读寄存器获取硬件的id号判断和此驱动支持的硬件lcm是否一致,如果一致就选择这个驱动。实现了驱动和设备正确匹配。在后面分析lcm的设备模型中会讲到。
lcm_get_params函数中主要是一些参数定义,例如屏的分辨率,屏的接口类型等;
下面三个函数主要和上电时序有关
下面几个函数和ESD有关
言归正传,LCM的设备模型也是遵守设备总线驱动结构的,只不过在这个基础上MTK又做了一些工作,封装出LCM_DRIVER 结构体。
platform虚拟总线,关在该总线的设备和驱动通过name来匹配。
在文件Mt_devs.c (arch\arm\mach-mt6572)中定义了LCM设备和资源,代码如下:
驱动文件出了MTK抽象出来的具体设备驱动文件外,这里指的是挂在platform上的驱动文件。Mtkfb.c (drivers\misc\mediatek\video\mt6572) 。
驱动的名字和设备匹配后,调用驱动的probe进行探测设备,并完成资源申请,sysfs文件系统操作等。最终在/dev/下生成设备文件节点。系统通过uevent通知udev,udev会收集在sysfs/class下面的文件信息,自动创建文件节点。
mtk_fb_probe函数主要做的工作如下:
/* Called by LDM binding to probe andattach a new device.
*Initialization sequence:
1.allocate system fb_info structure
select panel type according to machine type
2.init LCD panel
3.init LCD controller and LCD DMA
4.init system fb_info structure
5.init gfx DMA
6.enable LCD panel
start LCD frame transfer
7.register system fb_info structure
比较关键的函数是mtkfb_find_lcm_driver,这个函数调用具体设备驱动里面的函数和数据(例如:St7796s_hvga_dsi_ivo_txd.c (drivers\misc\mediatek\lcm\st7796s_hvga_dsi_ivo_txd))。
下面对其进行分析:
p =strstr(saved_command_line, "lcm=");获取从lk(uboot)传入的cmdline中的"lcm="数据,为LCM设备的名称。众所周知,uboot把控制权交给kernel之后会传入一些参数,其中cmdline为uboot传入kernel参数命令行。可以通过如下指令获得:cat /proc/cmdline .
&& /proc/cmdline &&:
console=tty0 console=ttyMT0, root=/dev/ram vmalloc=496Mslub_max_order=0 slub_debug=O
lcm=1-st7796s_hvga_dsi_ivo_txd fps=5480 vram=4194304bootprof.pl_t=1830 bootprof.lk_t=1628 printk.disable_uart=0ddebug_query="file
*mediatek* + file *gpu* =_" boot_reason=0androidboot.serialno=ABCDEF androidboot.bootreason=power_key
获得LCM名称以后就会调用if(DISP_SelectDevice(mtkfb_lcm_name)) 函数根据mtkfb_lcm_name 从LCM_DRIVER链表中获取对应的结构体指针,然后就传入了上面介绍的MTK客制化的一些LCM函数。
问题来了,uboot(LK)是怎么知道LCM的名字的呢?
在LK中也会有和kernel具体LCM驱动相同的设备驱动文件如
St7796s_hvga_dsi_ivo_txd.c(dev\lcm\st7796s_hvga_dsi_ivo_txd)。
LK也会把一系列LCM_DRIVER放入链表中,然后通过调用LCM_DRIVER里面的lcm_compare_id函数进行ID匹配,如果读到硬件的id和此驱动支持的id匹配,则选择此驱动。下面是对LK代码中LCM驱动的选择流程分析。
首先是LK总体代码执行的流程图:
在Kmain()函数中会有以下的函数调用流程:
在函数platform_early_init()函数里进行一系列的硬件初始化,看代码(精简):
mt_disp_init((void *)g_fb_base);函数会调用
DISP_CHECK_RET(DISP_Init((UINT32)lcdbase, (UINT32)lcdbase, FALSE));
DISP_Init函数在Disp_drv.c(platform\mt6572)
中定义,然后继续调用disp_drv_init_context()函数--》
if(!isLCMFound)
DISP_DetectDevice();
lcm_drv = disp_drv_get_lcm_driver(NULL);
--》判断LCM_DRIVER链表中lcm驱动的数量,如果为1个就直接拿来用给设备,不需要调用compare_id函数,如果多个就需要匹配硬件id号了。
驱动找到会把LCD_DRIVER结构体指针赋值到全局变量lcm_drv中。通过调用文件Mt_boot.c (app\mt_boot)中的intboot_linux_from_storage(void)函数
将lcm相关的信息,写到cmdline中,传递给kernel。
MTK lcm调试总结及解决思路
一、常见lcm问题
LCD会注意到一下问题:
1.gamma是否超标。
2.刷新率是否合适。
3.flicker现象是否严重或能否轻易察觉。
4.ESD是否合格。
5.背光调节是否存在问题...
MTK LCM驱动移植
对于LCM驱动移植,一般分为三部曲:
1、硬件IO口配置;
2、确保LCM背光能够正常点亮;
3、LCM驱动移植;
硬件电路:
1、GPIO配...
MTK lcm 驱动加载流程 android M
一直有一种强迫症,不把整个流程屡清楚就是蓝瘦香菇。做项目读博客多了,也就慢慢地搞清楚了。
安卓系统从power键按下释放,到lcm驱动显示,整个驱动的加载流程as follows:
lk阶段,还是...
mtk lcm调试
1.驱动添加
alps\kernel‐3.10\drivers\misc\mediatek\lcm\
alps\bootable\bootloader\lk\dev\lcm\2.makefil...
mtk设备模型之LCM
1、Linux设备模型
站在BSP的角度来看,整个系统可以由三部分组成:设备、总线、驱动。
Linux kernel有一些总线,比如USB、I2C等。对于每一个总线都会有一些设备和驱动...
MTK 平台lcm驱动框架分析1
源码路径:
kernel-3.18/arch/arm/boot/dts/mt6580.dtsi
kernel-3.18/drivers/mis...
MTK LCM显示驱动源码分析(一)
一. MTK的LCM驱动在以下目录中:
kernel-3.18\drivers\misc\mediatek\video\common\Mtkfb.c
二. Mtkfb.c源码分析:
mtk lcd调试
平台:mt65852 + Android 4.4 屏:HX8389B
那么首先来看的是如何配置lcd屏(在mtk中叫做lcm)。
1. ProjectConfig.mk中配置CUSTOM_LK_LC...
对MTK安卓平台LCM驱动的理解
一个项目兼容两块LCM或者更多,在工作中很常见,但是最近碰到个麻烦的事情,两块屏读出的ID总是相同的,搞了很久最后只能通过ADC的方法读LCM的一个分压电阻的电压来区分,具体做法是:
使用封装好了的A...
没有更多推荐了,下拉项目和编译
$ git clone ssh://172.16.16.15:29418/mtk_repository/MTK6580_WEG_L1_MP6.V2.19
$ git checkout -b MMI_W5900 origin/MMI_W5900
$ git pull
$ source build/envsetup.sh
$ copyproject SWY_W5910_A01
15. full_lcsh6580_weg_sh_l-eng
$ make -j8 2&&1 |tee wu-log-all.txt
参考吴庆亚添加LCM驱动
68d8b668 ([W5900_B02] 添加B02分支)
wuqingya &&
AuthorDate:
19:19:19 +0800
wuqingya &&
CommitDate:
19:19:19 +0800
[W5900][LCM]添加三供LCM GT
编译生成对应数据
$make lk -j8 2&&1 |tee wu-lon-.txt
$make kernel bootimage -j8 2&&1 |tee wu-lon-.txt
wuchengbing@ubuntu:~/mtk/W5900/MTK6580_WEG_L1_MP6.V2.19/alps/out/target/product/lcsh6580_weg_sh_l/obj/BOOTLOADER_OBJ/build-lcsh6580_weg_sh_l/dev/lcm/st7701_fwvga_dsi_vdo_gt$ l
st7701_fwvga_dsi_vdo_gt.d
st7701_fwvga_dsi_vdo_gt.o
wuchengbing@ubuntu:~/mtk/W5900/MTK6580_WEG_L1_MP6.V2.19/alps/out/target/product/lcsh6580_weg_sh_l/obj/KERNEL_OBJ/drivers/misc/mediatek/lcm/st7701_fwvga_dsi_vdo_gt$ l
built-in.o
modules.order
st7701_fwvga_dsi_vdo_gt.o
为*#87#工模添加lcm节点信息
TP fl10802
#if defined(LCT_ADD_TP_VERSION)
static int gtp_info_read_proc(struct file *file, char *buffer, size_t count,
loff_t *ppos)
LCM himax_852xES
params-&module="TXDY450SFWPC-15";
params-&vendor="TONGXINGDA";
params-&ic="FL10802";
params-&info="480*854";
从单屏到多屏兼容
#CUSTOM_LK_LCM = "st7701_fwvga_dsi_vdo_gt"
CUSTOM_LK_LCM = "ili9806e_dsi_vdo_fwvga_jd fl10802_fwvga_dsi_vdo_txd st7701_fwvga_dsi_vdo_gt"
#CONFIG_CUSTOM_KERNEL_LCM="st7701_fwvga_dsi_vdo_gt"
CONFIG_CUSTOM_KERNEL_LCM="ili9806e_dsi_vdo_fwvga_jd fl10802_fwvga_dsi_vdo_txd st7701_fwvga_dsi_vdo_gt"
Wu_Being博客声明:本人博客欢迎转载,请标明博客原文和原链接!谢谢!
《[lcm] MTK平台移植屏幕lcd过程要点》:
如果你看完这篇博文,觉得对你有帮助,并且愿意付赞助费,那么我会更有动力写下去。
mtk lcd屏 调试步骤详解
平台:mt65852 +
Android 4.4 屏:HX8389B
那么首先来看的是如何配置lcd屏(在mtk中叫做lcm)。
1. ProjectConfig.mk中配置
【Android】【LCD】LCD开发常见问题&分析
LCD开发常见问题&分析
1.LCD driver的框架(以msm8909为栗子)
2.命名规则:
nt35521-wxga-video
nt35590-q...
MTK lcm调试总结及解决思路
一、常见lcm问题
LCD会注意到一下问题:
1.gamma是否超标。
2.刷新率是否合适。
3.flicker现象是否严重或能否轻易察觉。
4.ESD是否合格。
5.背光调节是否存在问题...
[lcm] Qualcomm平台兼容多显示屏lcd的方法&并从lk传输到kernel过程
1如何兼容不同的LCD模组
1-通过LCD_ID的电平状态区分
2-通过IC的ID区分
3-通过LCD_ID和IC ID的结合区分
2LCD初始化过程
3读取LK屏的ID传输到kernel
MTK lcm 驱动加载流程 android M
一直有一种强迫症,不把整个流程屡清楚就是蓝瘦香菇。做项目读博客多了,也就慢慢地搞清楚了。
安卓系统从power键按下释放,到lcm驱动显示,整个驱动的加载流程as follows:
lk阶段,还是...
MTK6572平台中实现多厂商多型显示屏的兼容方案
MTK_LCD_Driver
代码的路是在/mediatek/source/kernel/driver/vedio/mtkfb.c
module_init(mtkfb_init);模块初始...
平台:mt65852 + Android 4.4 屏:HX8389B
那么首先来看的是如何配置lcd屏(在mtk中叫做lcm)。
1. ProjectConfig.mk中配置CUSTOM_LK_LC...
对于LCM驱动移植,一般分为三部曲:
1、硬件IO口配置;
2、确保LCM背光能够正常点亮;
3、LCM驱动移植;
硬件电路:
1、GPIO配...
许多学习嵌入式的进入MTK开发平台,很多东西都会感到很陌生。在MTK平台上你可以简简单单几分钟就点亮一块屏。加上MTK快速开发的节奏,也很少有时间自己整理学习。如果不思进取,不加班加点学习。很容易就慢...
没有更多推荐了,&|&&|&&|&&|&&
当前位置: >
对MTK安卓平台LCM驱动的理解
作者:xiaocaohuyang & 来源:转载 &
摘要: 一个项目兼容两块LCM或者更多,在工作中很常见,但是最近碰到个麻烦的事情,两块屏读出的ID总是相同的,搞了很久最后只能通过ADC的方法读LCM的一个分压电阻的电压来区分,具体做法是:
使用封装好了的ADC函数
externintIMM_GetOneChannelValue(intdwChannel,intdata[4],int*rawdata);该函数第一个参数是ADC通道选择,查看硬件原理图就知
一个项目兼容两块LCM或者更多,在工作中很常见,但是最近碰到个麻烦的事情,两块屏读出的ID总是相同的,搞了很久最后只能通过ADC的方法读LCM的一个分压电阻的电压来区分,具体做法是:
使用封装好了的ADC函数
extern int IMM_GetOneChannelValue(int dwChannel, int data[4], int* rawdata);
该函数第一个参数是ADC通道选择,查看硬件原理图就知道;第二个参数是一个数组指针,用来存放ADC采样得到的原始数据;最后一个参数貌似是采样频率,设置成NULL即可;如此得到ADC的原始采样数据后通过下面计算公司就可以得到电压值:
adcVol=data[0]*1000+data[1]*10; //单位:mV
例如我的代码段是:
extern int IMM_GetOneChannelValue(int dwChannel, int data[4], int* rawdata);
static unsigned int lcm_compare_id(void)
int data[4];
int adcVol=0;
int res=IMM_GetOneChannelValue(0,data,0);
adcVol=data[0]*1000+data[1]*10;
printf("[zlg0374@163.com]adcVol= %d mV \n", adcVol);
return (adcVol&800)?0:1;
在解决LCM的兼容问题过程中对MTK安卓平台的LCM驱动有了一点新理解:
1、LCM驱动的架构
A、LCM驱动源码
…\mediatek\custom\common\kernel\lcm…
B、LCM配置
…\mediatek\config\project\ProjectConfig.mk
源码目录中有一个文件是mt65xx_lcm_list.c,所有的lcm会在这个文件中声明一下自己的驱动,如果config文件中配置了某个lcm,那么这个lcm就会被放到一个列表中,如果兼容多个lcm,那么在config文件中配置了几个lcm,列表中就有几个lcm驱动。
2、如果只有一个lcm,那么系统不做区分,只要上电直接加载这个驱动;但是如果兼容好几块lcm,那么系统上电后就会按照列表中的顺序依次调用驱动中的读ID函数,如果发现ID匹配,那么就加载这个驱动,如果列表从头至尾ID都不匹配,最后加载列表最末端的那个驱动。
3、驱动在列表中的排列顺序不受config文件中配置lcm的先后顺序影响,而是根据mt65xx_lcm_list.c中的顺序排列。
具体这些分析可以参考…\mediatek\platform\mt6572\lk\disp_drv.c文件进一步理解。
版权所有 IT知识库 CopyRight (C)
IT知识库 IT610.com , All Rights Reserved.[DESCRIPTION]
CTS报告中反馈设备信息需要修改:
默认如下:
Small screen
Low density (120)
Normal screen
Low density (120)
Normal screen
Low density (120)
Normal screen
Mediumdensity(160)
Normal screen
High density (240)
Normal screen
High density (240)
Large screen
Medium density(160)
Large screen
Medium density(160)
客制化: 需要修改成实际值
Android L版本之后的客制化方法(包括L版本):
1. 实际的xdpi,ydpi的计算公式如下:
disp_data-&xdpi = info.physicalWidth == 0 ? density :
(info.displayWidth * 25.4f / info.physicalWidth);
disp_data-&ydpi = info.physicalHeight == 0 ? density :
(info.displayHeight * 25.4f / info.physicalHeight);
说明一下上面公式的各个参数:
density的值是ro.sf.lcd_density的值。
info.displayWidth是屏幕的width (如果480p的lcm,width*height=480*800)
info.displayHeight是屏幕的height
info.physicalWidth是需要在lcm_get_params函数里面设置。
info.physicalHeight是需要在lcm_get_params函数里面设置
从上面公式可以看到,如果在display driver里面有设置info.physicalWidth和
info.physicalHeight,就会根据上面的公式计算出实际的xdpi,ydpi;否则,就会直
接使用ro.sf.lcd_density的值赋值给xdpi,ydpi。
2. info.physicalWidth和info.physicalHeight在lcm driver里面对应到
lcm_get_params里面的params-&physical_width和params-&physical_height这两个值。
所以客户需要在lcm_get_params里面设置
params-&physical_width和params-&physical_height。
举例说明:
假设lcm的分辨率是480×800,然后需要设置的实际的Xdpi是239.05,Ydpi是236.27。
套用上面的公式可以得到:info.physicalWidth=51;info.physicalHeight=86.
所以直接在lcm_get_params里面如下设置,然后android就会根据上面的公式计算出实际的xdpi和ydpi:
params-&physical_width=51
params-&physical_height=86
Android L版本之前的客制化方法:
alps/system/core/init/property_patch.c
[SOLUTION]
请先到alps\mediatek\kernel\drivers\video\mtkfb.c
(或者alps\mediatek\platform\commonkernel\drivers\video\mtkfb.c
这只文件中的mtkf_ioctl函数MTKFB_GET_DISPLAY_IF_INFORMATION分支中确认是否有包含如下标灰部分代码:
如果有,那么只需要在对应的LCM driver中的lcm_get_params函数中添加如下参数即可
params-&physical_width
params-&physical_height = xxx;
xxx为当前使用的屏的实际size,单位是mm,且为是整数
如果没有,那么请按照如下添加:
1.alps\mediatek\custom\common\kernel\lcm\inc\lcm_drv.h 中typedef struct
//! how to control LCM registers
/* common parameters */
unsigned int io_select_ //DBI or DPI should select IO mode according to chip spec
/* particular parameters */
LCM_DBI_PARAMS
LCM_DPI_PARAMS
LCM_DSI_PARAMS
//MTK begin
unsigned int active_
unsigned int active_
} LCM_PARAMS;
2.alps\mediatek\source\kernel\drivers\video\disp_drv.c中添加
//MTK begin
UINT32 DISP_GetActiveHeight(void)
disp_drv_init_context();
if(lcm_params)
printk("[wwy]lcm_parms-&active_height = %d\n",lcm_params-&active_height);
return lcm_params-&active_
printk("WARNING!! get active_height before display driver inited!\n");
UINT32 DISP_GetActiveWidth(void)
disp_drv_init_context();
if(lcm_params)
printk("[wwy]lcm_parms-&active_width = %d\n",lcm_params-&active_width);
return lcm_params-&active_
printk("WARNING!! get active_width before display driver inited!\n");
3.alps\mediatek\source\kernel\drivers\video\disp_drv.h中申明
//MTK begin
UINT32 DISP_GetActiveWidth(void);
UINT32 DISP_GetActiveHeight(void);
4.alps\mediatek\source\kernel\drivers\video\mtkfb.c
static int mtkfb_check_var(struct fb_var_screeninfo *var, struct fb_info *fbi)
.............
var-&red.msb_right = var-&green.msb_right =
var-&blue.msb_right = var-&transp.msb_right = 0;
var-&activate = FB_ACTIVATE_NOW;
//MTK begin
if(var-&height &= 0)
var-&height
= UINT_MAX;
if(var-&width &= 0)
var-&width
= UINT_MAX;
var-&grayscale = 0;
var-&nonstd
var-&pixclock
= UINT_MAX;
var-&left_margin
= UINT_MAX;
var-&right_margin = UINT_MAX;
var-&upper_margin = UINT_MAX;
var-&lower_margin = UINT_MAX;
var-&hsync_len
= UINT_MAX;
var-&vsync_len
= UINT_MAX;
..........
static int mtkfb_fbinfo_init(struct fb_info *info)
struct mtkfb_device *fbdev = (struct mtkfb_device *)info-&
struct fb_var_
int r = 0;
MSG_FUNC_ENTER();
BUG_ON(!fbdev-&fb_va_base);
info-&fbops = &mtkfb_
info-&flags = FBINFO_FLAG_DEFAULT;
info-&screen_base = (char *) fbdev-&fb_va_
info-&screen_size = fbdev-&fb_size_in_
info-&pseudo_palette = fbdev-&pseudo_
r = fb_alloc_cmap(&info-&cmap, 16, 0);
if (r != 0)
PRNERR("unable to allocate color map memory\n");
// setup the initial video mode (RGB565)
memset(&var, 0, sizeof(var));
= MTK_FB_XRES;
= MTK_FB_YRES;
var.xres_virtual = MTK_FB_XRESV;
var.yres_virtual = MTK_FB_YRESV;
var.bits_per_pixel = 16;
var.red.offset
= 11; var.red.length
var.green.offset =
5; var.green.length = 6;
var.blue.offset
0; var.blue.length
//MTK begin
= DISP_GetActiveWidth();
var.height = DISP_GetActiveHeight();
var.activate = FB_ACTIVATE_NOW;
r = mtkfb_check_var(&var, info);
if (r != 0)
PRNERR("failed to mtkfb_check_var\n");
info-&var =
r = mtkfb_set_par(info);
if (r != 0)
PRNERR("failed to mtkfb_set_par\n");
MSG_FUNC_LEAVE();
5.在实际用到的屏的.c文件中(类似这样nt35516_qhd_dsi_cmd_ipsboe.c的文件)
做如下修改:
在lcm_get_params(LCM_PARAMS *params)中增加:
params-&active_width
= active_width;
params-&active_height = active_height;
这样就能根据实际的屏幕尺寸算出准确的xdpi,ydpi.
另外請注意這裡的active_width/active_height 是指屏的physical size. 也就是寬高的实际大小,单位mm,且需要为整数而不是resolution.. 請從panel spec找出對應的physical size.
– var-&active_width = 90 (mm)
– var-&active_height = 154 (mm)
– And we can get
– X DPI = 600 * 25.4 / 90 = 169.33
– Y DPI = 1024 * 25.4 / 153 = 169.99
android手机分辨率,xDpi,yDpi,尺寸等各种相关物理参数
android机型物理参数获取与计算
mdpi、hdpi、xdpi、xxdpi对应的密度
dip設置與分辯率無關,但写屏幕密度有关.在默认情况下,
LDPI密度为120,系数为0.75,
MDPI的密度为160,系数为1.0;
HDPI的密码为240,系数为1.5;
XHDPI的密...
Android上常见度量单位【xdpi、hdpi、mdpi、ldpi】解读
术语和概念
屏幕的物理尺寸,以屏幕的对角线长度作为依据(比如 2.8寸, 3.5寸)。
简而言之, Android把所有的屏幕尺寸简化为三大类:大,正常,和小。
程序可以针对...
Android ldpi mdpi hdpi xdpi
话说微技巧这个词也是我自己发明的,因为drawable这个东西相信大家天天都在使用,每个人都再熟悉不过了,之所以叫微技巧就是对于这个我们再熟悉不过的技术,可能还有一些你所不知道的细节,那今天我们就来一...
1、了解几个概念
(1)分辨率。分辨率就是手机屏幕的像素点数,一般描述成屏幕的“宽×高”,安卓手机屏幕常见的分辨率有480×800、720××1920等。720×1280表示此屏幕...
es文件夹的一些文件夹为什么要分出一些分支?例如drawable分出drawable-hdpi?
原因很简单,大家要明白Android是一个分裂很严重的系统。每个设备的屏幕大...
没有更多推荐了,

我要回帖

更多关于 1个plc对应2个触摸屏 的文章

 

随机推荐