通讯地址:山东聊城经济开发区华山路南首30号
固定电话:0635-8888299
传真号码:0635-8888109
移动电话:13287501888
联系人:陈经理
电子邮箱:1262980066@qq.com
网站编辑:江西华盈非晶合金变压器有限公司 │ 发表时间:2019-03-22
江西非晶合金变压器? 江西非晶合金变压器是根据效应制作的一种磁场江西非晶合金变压器。效应是磁电效应的一种,这一现象是(A.H.Hall,1855—1938)于1879年在研究金属的导电机构时发现的。后来发现半导体、导体等也有这种效应,而半导体的效应比金属强得多,利用这现象制成的各种元件,广泛地应用于工业自动化技术、检测技术及信息处理等方面。效应是研究半导体材料性能的基本方法。通过效应实验测定的系数,能够判断半导体材料的导电类型、载流子浓度及载流子迁移率等重要参数。? 工作原理? 磁场中有一个半导体片,恒定I从A到B通过该片。在洛仑兹力的作用下,I的电子流在通过半导体时向一侧偏移,使该片在CD方向上产生电位差,这就是所谓的电压。? 电压随磁场强度的变化而变化,磁场越强,电压越高,磁场越弱,电压越低,电压值很小,通常只有几个毫伏,但经集成电路中的放大器放大,就能使该电压放大到足以输出较强的信号。若使集成电路起传感作用,需要用机械的方法来改变磁感应强度。下图所示的方法是用一个转动的叶轮作为控制磁通量的开关,当叶轮叶片处于磁铁和集成电路之间的气隙中时,磁场偏离集成片,电压消失。这样,集成电路的输出电压的变化,就能表示出叶轮驱动轴的某一位置,利用这一工作原理,可将集成电路片用作用点火正时江西非晶合金变压器。效应江西非晶合金变压器属于被动型江西非晶合金变压器,它要有外加电源才能工作,这一特点使它能检测转速低的运转情况。? 效应? 效应从本质上讲是运动的带电粒子在磁场中受洛仑兹力作用引起的偏转。当带电粒子(电子或空穴)被约束在固体材料中,这种偏转就导致在垂直和磁场的方向上产生正负电荷的聚积,从而形成附加的横向电场。对于图一所示的半导体试样,若在X方向通以Is,在Z方向加磁场B,则在Y方向即试样A,A′电极两侧就开始聚积异号电荷而产生相应的附加电场。电场的指向取决定于测试样品的电类型。显然,该电场是阻止载流子继续向侧面偏移,? 当载流子所受的横向电场力eEH与洛仑兹力相等时,样品两侧电荷的积累就达到平衡,故有? ⑴? 其中EH为电场,V是载流子在方向上的平均漂移速度。设试样的宽为b,厚度为d,载流子浓度为n,则? ⑵? 由⑴、⑵两式可得? ⑶? 即电压VH(A、A′电极之间的电压)与ISB乘积正比与试样厚度d成反比。比例系数 称为系数,它是反映材料效应强弱的重要参数,只要测出 VH(伏)以及知道IIs(安)、B(高斯)和d(厘 米)可按下式计算RH(厘米3/库仑)? 分类? 江西非晶合金变压器分为线型江西非晶合金变压器和开关型江西非晶合金变压器两种。? (一)开关型江西非晶合金变压器由稳压器、元件、差分放大器,斯密特触发器和输出级组成,它输出数字量。开关型江西非晶合金变压器还有一种特殊的形式,称为锁键型江西非晶合金变压器。? (二)线性型江西非晶合金变压器由元件、线性放大器和射极跟随器组成,它输出模拟量。? 线性江西非晶合金变压器又可分为开环式和闭环式。闭环式江西非晶合金变压器又称零磁通江西非晶合金变压器。线性江西非晶合金变压器主要用于交直流和电压测量。。? 开关型? 如图4所示,其中Bnp为工作点“开http://guizhou.sdshsk.com/”的磁感应强度,BRP为释放点“关”的磁感应强度。当外加的磁感应强度超过动作点Bnp时,江西非晶合金变压器输出低电平,当磁感应强度降到动作点Bnp以下时,江西非晶合金变压器输出电平不变,一直要降到释放点BRP时,江西非晶合金变压器才由低电平跃变为高电平。Bnp与BRP之间的滞后使开关动作更为可靠。? 锁键型? 如图5所示,当磁感应强度超过动作点Bnp时,江西非晶合金变压器输出由高电平跃变为低电平,而在外磁场撤消后,其输出状态保持不变(即锁存状态),必须施加反向磁感应强度达到BRP时,才能使电平产生变化。? 线性型? 输出电压与外加磁场强度呈线性关系,如图3所示,可见,在B1~B2的磁感应强度范围内有较好的线性度,磁感应强度超出此范围时则呈现饱和状态。? 开环式江西非晶合金变压器? 由于通电螺线管内部存在磁场,其大小与导线中的成正比,故可以利用江西非晶合金变压器测量出磁场,从而确定导线中的大小。利用这一原理可以设计制成江西非晶合金变压器。其优点是不与被测电路发生电接触,不影响被测电路,不消耗被测电源的功率,特别适合于大传感。? 江西非晶合金变压器工作原理如图6所示,标准圆环铁芯有一个缺口,将江西非晶合金变压器插入缺口中,圆环上绕有线圈,当通过线圈时产生磁场,则江西非晶合金变压器有信号输出。? 闭环式江西非晶合金变压器? 磁平衡式江西非晶合金变压器也叫闭环江西非晶合金变压器,也称补偿式江西非晶合金变压器,即主回路被测Ip在聚磁环处所产生的磁场通过一个次级线圈,所产生的磁场进行补偿, 从而使器件处于检测零磁通的工作状态。? 磁平衡式江西非晶合金变压器的具体工作过程为:当主回路有一通过时,在导线上产生的磁场被聚磁环聚集并感应到器件上, 所产生的信号输出用于驱动相应的功率管并使其导通,从而获得一个补偿Is。 这一再通过多匝绕组产生磁场 ,该磁场与被测产生的磁场正好相反,因而补偿了原来的磁场, 使器件的输出逐渐减小。当与Ip与匝数相乘 所产生的磁场相等时,Is不再增加,这时的器件起指示零磁通的作用 ,此时可以通过Is来平衡。被测的任何变化都会破坏这一平衡。 一旦磁场失去平衡,器件就有信号输出。经功率放大后,立即就有相应的流过次级绕组以对失衡的磁场进行补偿。从磁场失衡到再次平衡,所需的时间理论上不到1μs,这是一个动态平衡的过程。
2. dws配中断脚和使能脚
(根据原理图中“09_CAMERA_SENSOR”页中, “HALL”部分【OUT】引脚所连接 - 使能脚GPIO12)
v666为例
dws配置pin脚: - 由于硬件上拉-》dws也要配成上拉
EintMode|Def.Mode M0|M1|M2|M3|M4|M5|M6|M7|InPull En|InPull SelHigh|Def.Dir|In|Out|OutHigh|VarName1
GPIO12 1 0:GPIO12 1 1 IN GPIO_HALL_1_PIN
dws配置EINT:
EINTVar|Debounce Time(ms)|Polarity|SensiTIve_Level|Debounce En
EINT12 HALL_1 0 Low Level Disable
dts:
* HALL GPIO standardizaTIon */
&pio {
hall_pin_default: halldefaultcfg {
};
hall_pin_as_int: hallint@12 {
pins_cmd_dat {
pins = 《PINMUX_GPIO12__FUNC_GPIO12》;
slew-rate = 《0》;
bias-pull-up = 《00》;
};
};
};
&keypad {
pinctrl-names = “default”, “hall_pin_as_int”;
pinctrl-0 = 《&hall_pin_default》;
pinctrl-1 = 《&hall_pin_as_int》;
status = “okay”;
};
/* HALL GPIO end */
一、 查看是否有键值上报
getevent -i
add device 8: /dev/input/event1
bus: 0019
vendor 2454
product 6500
version 0010
name: “mtk-kpd” // 与音量加减键、电源键、hall同一个event
locaTIon: “”
id: “”
version: 1.0.1
getevent -t /dev/input/event1 // 打印出来的是16进制
[70.169911] 0001 0085 00000001 // 85 -》 133 远离
[70.169911] 0000 0000 00000000
[70.352126] 0001 0085 00000000
[70.352126] 0000 0000 00000000
二、查看代码确定上报键值
1. alps\kernel-3.18\drivers\input\keyboard\mediatek\kpd.c
#define KEY_HALL_F3 133 //for hall eint report key far // 磁铁远离
#define KEY_HALL_F4 134 //for hall eint report key close // 磁铁靠近
2. alps/device/magcomm/magc6580_we_c_m/mtk-kpd.kl , 映射给上层
key 114 0x72 VOLUME_DOWN // 侧键
key 115 0x73 VOLUME_UP
key 116 0x74 POWER
+ key 133 F3 //
+ key 134 F4
注:修改此文件,可以用push的方式先试验
find /system -name mtk-kpd.kl
/system/usr/keylayout/mtk-kpd.kl
adb push 。.. /system/usr/keylayout/
三、添加权限
alps/device/mediatek/common/sepolicy/basic/system_app.te
# add permission for hall
allow system_app sysfs_keypad_file:dir { search read write };
allow system_app sysfs_keypad_file:file { read write getattr setattr open create };
alps/device/mediatek/common/sepolicy/full/platform_app.te
# add permission for hall
allow platform_app sysfs_keypad_file:dir { search read write };
allow platform_app sysfs_keypad_file:file { read write getattr setattr open create };
alps/device/mediatek/common/sepolicy/full/priv_app.te
# add permission for hall
allow priv_app sysfs_keypad_file:dir { search read write };
allow priv_app sysfs_keypad_file:file { read write getattr setattr open create };
四、手写笔插入与拔出 - 用hall来实现,手写笔尖有磁性(以80 5.1为例)
1. 修改alps/device/haocheng/hct6580_weg_a_l/mtk-kpd.kl ,映射给上层
key 133 F3
key 134 F4
+ key 136 F6
+ key 137 F7
2. 修改alps\kernel-3.10\drivers\misc\mediatek\keypad\kpd.c,仿造hall_1添加hall_2的代码:
+ #ifdef GPIO_HALL_2_PIN
#define CUSTOM_HALL_2_SUPPORT
#define GPIO_HALL_2_EINT_PIN GPIO_HALL_2_PIN
#define GPIO_HALL_2_EINT_PIN_M_EINT GPIO_HALL_2_PIN_M_EINT
staTIc unsigned int hall_2_irq;
#define HALL_2_TAG “hall: ”
#define HALL_2_DBG(fmt, args.。.) printk(HALL_2_TAG fmt, ##args)
struct work_struct hall_2_eint_work;
static int hall_2_state_flag = 0;
static bool hall_2_state = 1; //0: close 1:far
#define KEY_HALL_F6 136 //for hall eint report key far
#define KEY_HALL_F7 137 //for hall eint report key close
+ #endif
+ #ifdef CUSTOM_HALL_2_SUPPORT // 提供给上层调用接口: /sys/bus/。..
static volatile int hall_2_status = 0;
static ssize_t store_hall_2_state(struct device_driver *ddri, const char *buf, size_t count)
{
if (sscanf(buf, “%u”, &hall_2_status) != 1) {
kpd_print(“kpd call state: Invalid values\n”);
return -EINVAL;
}
hall_2_state = (bool)hall_2_status;
return count;
}
static ssize_t show_hall_2_state(struct device_driver *ddri, char *buf)
{
ssize_t res;
res = snprintf(buf, PAGE_SIZE, “%d\n”, hall_2_state);
return res;
}
static DRIVER_ATTR(hall_2_state, S_IWUSR | S_IALLUGO, show_hall_2_state, store_hall_2_state);
+ #endif
static struct driver_attribute *kpd_attr_list[] = {
&driver_attr_kpd_call_state,
#ifdef CUSTOM_HALL_SUPPORT
&driver_attr_hall_state,
#endif
+ #ifdef CUSTOM_HALL_2_SUPPORT // 提供给上层调用接口: /sys/bus/。..
+ &driver_attr_hall_2_state,
+ #endif
};
+ #ifdef CUSTOM_HALL_2_SUPPORT
+ void kpd_hall_2_key_handler(unsigned long pressed, u16 linux_keycode)
{
if(!kpd_input_dev) {
printk(“KPD input device not ready\n”);
return;
}
input_report_key(kpd_input_dev, linux_keycode, pressed);
input_sync(kpd_input_dev);
if (kpd_show_hw_keycode) {
printk(KPD_SAY “(%s) KEY_HALL keycode =%d \n”, pressed ? “pressed” : “released”, linux_keycode);
}
}
static void hall_2_work_func(struct work_struct *work)
{
if(hall_2_state == 1) {
kpd_hall_key_handler(1, KEY_HALL_F6);
kpd_hall_key_handler(0, KEY_HALL_F6);
} else if(hall_2_state == 0) {
kpd_hall_key_handler(1, KEY_HALL_F7);
kpd_hall_key_handler(0, KEY_HALL_F7);
}
}
bool get_hall_2_state()
{
return hall_2_state;
}
EXPORT_SYMBOL(get_hall_2_state);
void hall_2_eint_func(void)
{
disable_irq_nosync(hall_2_irq);
if(hall_2_state_flag)
{
hall_2_state_flag = 0;
hall_2_state = 1;
irq_set_irq_type(hall_2_irq,IRQ_TYPE_LEVEL_LOW);
}
else{
hall_2_state_flag = 1;
hall_2_state = 0;
irq_set_irq_type(hall_2_irq,IRQ_TYPE_LEVEL_HIGH);
}
enable_irq(hall_2_irq);
schedule_work(&hall_2_eint_work);
}
static irqreturn_t hall_2_irq_handler(int irq, void *dev_id)
{
hall_2_eint_func();
return IRQ_HANDLED;
}
int hall_2_setup_eint(void)
{
struct device_node *hall_node;
u32 ints[2] = {0, 0};
mt_set_gpio_dir(GPIO_HALL_2_EINT_PIN, GPIO_DIR_IN);
mt_set_gpio_mode(GPIO_HALL_2_EINT_PIN, GPIO_HALL_2_EINT_PIN_M_EINT);
mt_set_gpio_pull_enable(GPIO_HALL_2_EINT_PIN, 0);
hall_node = of_find_compatible_node(NULL,NULL,“mediatek, HALL_2-eint”);
if(hall_node){
printk(“hall_irq has find!\n”);
of_property_read_u32_array(hall_node, “debounce”, ints, ARRAY_SIZE(ints));
mt_gpio_set_debounce(ints[0], ints[1]);
hall_2_irq= irq_of_parse_and_map(hall_node, 0);
if (!hall_2_irq)
{
printk(“irq_of_parse_and_map hall fail!!\n”);
return -EINVAL;
}
if(request_irq(hall_2_irq, hall_2_irq_handler, IRQF_TRIGGER_NONE, “HALL_2-eint”, NULL)) {
printk(“HALL IRQ NOT AVAILABLE!!\n”);
return -EINVAL;
}
}
else{
printk(“null hall_irq node!\n”);
return -EINVAL;
}
return 0;
}
#endif
static int kpd_pdrv_probe(struct platform_device *pdev)
{
#ifdef CUSTOM_HALL_SUPPORT
__set_bit(KEY_HALL_F3, kpd_input_dev-》keybit);
__set_bit(KEY_HALL_F4, kpd_input_dev-》keybit);
#endif
+ #ifdef CUSTOM_HALL_2_SUPPORT
+ __set_bit(KEY_HALL_F6, kpd_input_dev-》keybit); // 使能input上报键值
+ __set_bit(KEY_HALL_F7, kpd_input_dev-》keybit);
+ #endif
。..
#ifdef CUSTOM_HALL_SUPPORT
INIT_WORK(&hall_eint_work, hall_work_func);
hall_setup_eint();
#endif
+ #ifdef CUSTOM_HALL_2_SUPPORT
+ INIT_WORK(&hall_2_eint_work, hall_2_work_func); // 中断中唤醒工作,工作中上报key
+ hall_2_setup_eint(); // 设置GPIO口状态,从dts获取中断信息,注册中断
+ #endif
。..
}
3. 修改dws,配置GPIO口为中断模式,配置中断的触发方式(电平or边沿)
五、39平台:
1. device/mediateksample/k39tv1_bsp_1g/mtk-kpd.kl
+ key 133 F3
+ key 134 F4
2. mt6739.dts
+ hall_1: hall_1 {
+ compatible = “mediatek, hall_1-eint”;
+ status = “disabled”;
+ };
3. k39tv1_bsp_1g.dts
+ /* HALL GPIO standardization */
+ &keypad {
pinctrl-names = “default”, “hall_pin_as_int”;
pinctrl-0 = 《&hall_pin_default》;
pinctrl-1 = 《&hall_pin_as_int》;
status = “okay”;
};
&pio {
hall_pin_default: halldefaultcfg {
};
hall_pin_as_int: hallint@14 {
pins_cmd_dat {
pins = 《PINMUX_GPIO14__FUNC_GPIO14》;
slew-rate = 《0》;
bias-pull-up = 《00》;
};
};
+ };
+ /* HALL GPIO end */
4. codegen.dws
EINT:
ID EINTVar|Debounce Time(ms)|Polarity|Sensitive_Level|Debounce En
EINT14 HALL_1 0 Low Level Disable
GPIO:
ID EintMode|Def.Mode M0|M1|M2|M3|M4|M5|M6|M7|InPull En|InPull SelHigh|Def.Dir|In|Out|OutHigh|VarName1
GPIO14 1 0:GPIO14 1 1 1 IN 1 GPIO_HALL_1_PIN
5. kernel-4.4/drivers/input/keyboard/mediatek/kpd.c
+ #ifdef CONFIG_KST_HALL_SUPPORT
+ #define CUSTOM_HALL_SUPPORT
#define GPIO_HALL_EINT_PIN GPIO_HALL_1_PIN
#define GPIO_HALL_EINT_PIN_M_EINT GPIO_HALL_1_PIN_M_EINT
static unsigned int hall_irq;
#define HALL_TAG “hall: ”
#define HALL_DBG(fmt, args.。.) printk(HALL_TAG fmt, ##args)
struct work_struct hall_eint_work;
static int hall_state_flag = 0;
static bool hall_state = 1; //0: close 1:far
#define KEY_HALL_F3 133 //116 //for hall eint report key far
#define KEY_HALL_F4 134 //62 //for hall eint report key close
struct pinctrl *hallpinctrl;
+ struct pinctrl_state *hall_pin_as_int;
+ #endif
+ #ifdef CUSTOM_HALL_SUPPORT
+ static volatile int hall_status = 0;
static ssize_t store_hall_state(struct device_driver *ddri, const char *buf, size_t count)
{
if (sscanf(buf, “%u”, &hall_status) != 1) {
kpd_print(“kpd call state: Invalid values\n”);
return -EINVAL;
}
hall_state = (bool)hall_status;
return count;
}
static ssize_t show_hall_state(struct device_driver *ddri, char *buf)
{
ssize_t res;
res = snprintf(buf, PAGE_SIZE, “%d\n”, hall_state);
return res;
}
+ static DRIVER_ATTR(hall_state, S_IWUSR | S_IRUGO, show_hall_state, store_hall_state);
+ #endif
static struct driver_attribute *kpd_attr_list[] = {
&driver_attr_kpd_call_state,
+ #ifdef CUSTOM_HALL_SUPPORT
+ &driver_attr_hall_state,
+ #endif
};
+ #ifdef CUSTOM_HALL_SUPPORT
+ void kpd_hall_key_handler(unsigned long pressed, u16 linux_keycode)
{
if(!kpd_input_dev) {
printk(“KPD input device not ready\n”);
return;
}
input_report_key(kpd_input_dev, linux_keycode, pressed);
input_sync(kpd_input_dev);
if (kpd_show_hw_keycode) {
printk(KPD_SAY “(%s) KEY_HALL keycode =%d \n”, pressed ? “pressed” : “released”, linux_keycode);
}
}
static void hall_work_func(struct work_struct *work)
{
printk(“key hall_work_func not ready\n”); //add
if(hall_state == 1) {
kpd_hall_key_handler(1, KEY_HALL_F3);
kpd_hall_key_handler(0, KEY_HALL_F3);
}
else if(hall_state == 0) {
kpd_hall_key_handler(1, KEY_HALL_F4);
kpd_hall_key_handler(0, KEY_HALL_F4);
}
}
void hall_eint_func(void)
{
disable_irq_nosync(hall_irq);
if(hall_state_flag)
{
hall_state_flag = 0;
hall_state = 1;
irq_set_irq_type(hall_irq,IRQ_TYPE_LEVEL_LOW);
}
else
{
hall_state_flag = 1;
hall_state = 0;
irq_set_irq_type(hall_irq,IRQ_TYPE_LEVEL_HIGH);
}
enable_irq(hall_irq);
schedule_work(&hall_eint_work);
}
static irqreturn_t hall_irq_handler(int irq, void *dev_id)
{
hall_eint_func();
return IRQ_HANDLED;
}
int hall_setup_eint(void)
{
struct device_node *hall_node;
u32 ints[2] = {0, 0};
hall_node = of_find_compatible_node(NULL,NULL,“mediatek, hall_1-eint”);
if(hall_node){
printk(“hall_irq has find!\n”);
of_property_read_u32_array(hall_node, “debounce”, ints, ARRAY_SIZE(ints));
gpio_set_debounce(ints[0], ints[1]);
hall_irq= irq_of_parse_and_map(hall_node, 0);
if (!hall_irq)
{
printk(“irq_of_parse_and_map hall fail!!\n”);
return -EINVAL;
}
if(request_irq(hall_irq, hall_irq_handler, IRQF_TRIGGER_NONE, “hall_1-eint”, NULL)) {
printk(“HALL IRQ NOT AVAILABLE!!\n”);
return -EINVAL;
}
}
else
{
printk(“null hall_irq node!\n”);
return -EINVAL;
}
return 0;
+ }
+ #endif
+ #ifdef CUSTOM_HALL_SUPPORT
+ int hall_get_gpio_info(struct platform_device *pdev)
{
int ret;
hallpinctrl = devm_pinctrl_get(&pdev-》dev);
if (IS_ERR(hallpinctrl)) {
ret = PTR_ERR(hallpinctrl);
dev_err(&pdev-》dev, “hallpinctrl err!\n”);
return ret;
}
hall_pin_as_int = pinctrl_lookup_state(hallpinctrl, “hall_pin_as_int”);
if (IS_ERR(hall_pin_as_int)) {
ret = PTR_ERR(hall_pin_as_int);
dev_err(&pdev-》dev, “hall_pin_as_int err!\n”);
return ret;
}
pinctrl_select_state(hallpinctrl, hall_pin_as_int);
return 0;
+ }
+ #endif
static int kpd_pdrv_probe(struct platform_device *pdev)
{
__set_bit(KPD_KEY_MAP, kpd_input_dev-》keybit);
+ #ifdef CUSTOM_HALL_SUPPORT
+ __set_bit(KEY_HALL_F3, kpd_input_dev-》keybit);
+ __set_bit(KEY_HALL_F4, kpd_input_dev-》keybit);
+ #endif
。..
hrtimer_init(&aee_timer_5s, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
aee_timer_5s.function = aee_timer_5s_func;
+ #ifdef CUSTOM_HALL_SUPPORT
+ INIT_WORK(&hall_eint_work, hall_work_func);
+ hall_get_gpio_info(pdev);
+ hall_setup_eint();
+ #endif
err = kpd_create_attr(&kpd_pdrv.driver);
。..
}
调试案例
案例一 : hall不通 - 电容贴错
现象 :
平台 : androidN,MTK6737
排查过程: 1. 查看是否有键值上报 - 拿磁铁靠近
getevent -t /dev/input/event1 - 无键值上报
2. 检查dws中的gpio口配置&中断配置、dts中断配置均ok(根据原理图得知EINT12 即 GPIO12)
3. 接示波器量中断脚 - 磁铁靠近时 中断脚无高低电平变化
4. 交给硬件同事检查 -》 一个电容贴错,替换后ok
处理方案: 换料 改bom
案例二 : hall不通 - hall芯片贴反
现象 :
平台 : androidN,MTK6737
排查过程: 1. 查看是否有键值上报 - 拿磁铁靠近
getevent -t /dev/input/event1 - 无键值上报
2. 检查dws中的gpio口配置&中断配置、dts中断配置均ok
3. hall芯片贴反了 -》 改正ok
案例三 : hall不通 - 硬件短路
现象 :
平台 : androidN,MTK6737
排查过程: 1. 查看是否有键值上报 - 拿磁铁靠近
getevent -t /dev/input/event1 - 无键值上报
2. 用镊子将hall中断脚短地(平常上拉为高电平,低电平为中断) - 有键值上报
Copyright © 2017 江西非晶合金变压器_江西干式变压器_华盈非晶合金变压器有限公司 技术支持:互联纵横
<meta name="wlhlauth" content="26b08b3170bb57da2daa8fd2903c5785"/>