精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Linux紅外驅動重點解析

系統 Linux
紅外遙控是我們經常見到的一種無線收發設備,比如電視遙控,空調遙控,現在電視遙控有些慢慢變成了藍牙裝置。昨天是在知識星球里面看到有人提問,今天來解析一份網友寫的驅動程序。

 [[400687]]

紅外遙控是我們經常見到的一種無線收發設備,比如電視遙控,空調遙控,現在電視遙控有些慢慢變成了藍牙裝置。昨天是在知識星球里面看到有人提問,今天來解析一份網友寫的驅動程序。

調試紅外需要注意幾個細節

1、我們發射的遙控器用肉眼是看不到的,需要拿相機來觀察。

2、紅外接收管和普通的二極管不同,如果用錯物料也是不行的。

1.NEC協議無線傳輸數據原理

NEC協議的特征: 

1、8位地址和8位指令長度; 

2、地址和命令兩次傳輸;(確保可靠性) 

3、PWM脈沖寬度調制,以發射紅外載波的占空比代表“0”和“1”; 

4、載波頻率為38KHz 

5、位時間為1.125ms和2.25ms 

NEC碼位的定義:一個脈沖對應560us的連續載波,一個邏輯1傳輸需要2.25ms(560us脈沖+1680us低電平),一個邏輯0的 傳輸需要1.125ms(560us脈沖+560us低電平)。

而遙控接收頭在收到脈沖時為低電平,在沒有收到脈沖時為高電平,因此, 我們在接收頭端收到的信號為:邏輯1應該是560us低+1680us高,邏輯0應該是560us低+560us高。

如下圖:

硬件

2. Linux下的驅動接收程序

參考原文:

https://blog.csdn.net/wllw7176/article/details/110506677

兩個驅動文件 

  1. gpio-ir-recv.c  
  2. /* Copyright (c) 2012, Code Aurora Forum. All rights reserved.  
  3.  *  
  4.  * This program is free software; you can redistribute it and/or modify  
  5.  * it under the terms of the GNU General Public License version 2 and  
  6.  * only version 2 as published by the Free Software Foundation.  
  7.  *  
  8.  * This program is distributed in the hope that it will be useful,  
  9.  * but WITHOUT ANY WARRANTY; without even the implied warranty of  
  10.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the  
  11.  * GNU General Public License for more details.  
  12.  */ 
  13. #include <linux/kernel.h>  
  14. #include <linux/init.h>  
  15. #include <linux/module.h>  
  16. #include <linux/interrupt.h>  
  17. #include <linux/gpio.h>  
  18. #include <linux/slab.h>  
  19. #include <linux/of.h>  
  20. #include <linux/of_gpio.h>  
  21. #include <linux/platform_device.h>  
  22. #include <linux/irq.h>  
  23. #include <media/rc-core.h>  
  24. #include <media/gpio-ir-recv.h>  
  25. #define GPIO_IR_DRIVER_NAME "gpio-rc-recv"  
  26. #define GPIO_IR_DEVICE_NAME "gpio_ir_recv"  
  27. struct gpio_rc_dev {  
  28.  struct rc_dev *rcdev;  
  29.  int gpio_nr;  
  30.  bool active_low;  
  31. };  
  32. #ifdef CONFIG_OF  
  33. /*  
  34.  * Translate OpenFirmware node properties into platform_data  
  35.  */  
  36. static int gpio_ir_recv_get_devtree_pdata(struct device *dev,  
  37.       struct gpio_ir_recv_platform_data *pdata)  
  38.  
  39.  struct device_node *np = dev->of_node;  
  40.  enum of_gpio_flags flags;  
  41.  int gpio;  
  42.  gpio = of_get_gpio_flags(np, 0, &flags);  
  43.  if (gpio < 0) {  
  44.   if (gpio != -EPROBE_DEFER)  
  45.    dev_err(dev, "Failed to get gpio flags (%d)\n", gpio);  
  46.   return gpio;  
  47.  }  
  48.  pdata->gpiogpio_nr = gpio;  
  49.  pdata->active_low = (flags & OF_GPIO_ACTIVE_LOW);  
  50.  /* probe() takes care of map_name == NULL or allowed_protos == 0 */  
  51.  pdata->map_name = of_get_property(np, "linux,rc-map-name", NULL);  
  52.  pdata->allowed_protos = 0 
  53.  return 0;  
  54.  
  55. static const struct of_device_id gpio_ir_recv_of_match[] = {  
  56.  { .compatible = "gpio-ir-receiver", },  
  57.  { },  
  58. };  
  59. MODULE_DEVICE_TABLE(of, gpio_ir_recv_of_match); 
  60. #else /* !CONFIG_OF */  
  61. #define gpio_ir_recv_get_devtree_pdata(dev, pdata) (-ENOSYS)  
  62. #endif  
  63. static irqreturn_t gpio_ir_recv_irq(int irq, void *dev_id) 
  64.  
  65.  struct gpio_rc_dev *gpio_dev = dev_id 
  66.  int gval;  
  67.  int rc = 0 
  68.  enum raw_event_type type = IR_SPACE 
  69.  gval = gpio_get_value(gpio_dev->gpio_nr);  
  70.  if (gval < 0 
  71.   goto err_get_value;  
  72.  if (gpio_dev->active_low)  
  73.   gval = !gval;  
  74.  if (gval == 1)  
  75.   type = IR_PULSE 
  76.  rc = ir_raw_event_store_edge(gpio_dev->rcdev, type);  
  77.  if (rc < 0 
  78.   goto err_get_value;  
  79.  ir_raw_event_handle(gpio_dev->rcdev);  
  80. err_get_value:  
  81.  return IRQ_HANDLED;  
  82.  
  83. static int gpio_ir_recv_probe(struct platform_device *pdev)  
  84.  
  85.  struct gpio_rc_dev *gpio_dev;  
  86.  struct rc_dev *rcdev;  
  87.  const struct gpio_ir_recv_platform_data *pdata =  
  88.      pdev->dev.platform_data;  
  89.  int rc;  
  90.  if (pdev->dev.of_node) {  
  91.   struct gpio_ir_recv_platform_data *dtpdata =  
  92.    devm_kzalloc(&pdev->dev, sizeof(*dtpdata), GFP_KERNEL);  
  93.   if (!dtpdata)  
  94.    return -ENOMEM;  
  95.   rc = gpio_ir_recv_get_devtree_pdata(&pdev->dev, dtpdata);  
  96.   if (rc)  
  97.    return rc;  
  98.   pdata = dtpdata 
  99.  }  
  100.  if (!pdata)  
  101.   return -EINVAL;  
  102.  if (pdata->gpio_nr < 0 
  103.   return -EINVAL;  
  104.  gpio_dev = kzalloc(sizeof(struct gpio_rc_dev), GFP_KERNEL);  
  105.  if (!gpio_dev)  
  106.   return -ENOMEM;  
  107.  rcdev = rc_allocate_device();  
  108.  if (!rcdev) {  
  109.   rc = -ENOMEM;  
  110.   goto err_allocate_device;  
  111.  }  
  112.  rcdev->priv = gpio_dev 
  113.  rcdev->driver_type = RC_DRIVER_IR_RAW 
  114.  rcdev->input_name = GPIO_IR_DEVICE_NAME 
  115.  rcdev->input_phys = GPIO_IR_DEVICE_NAME "/input0";  
  116.  rcdev->input_id.bustype = BUS_HOST 
  117.  rcdev->input_id.vendor = 0x0001 
  118.  rcdev->input_id.product = 0x0001 
  119.  rcdev->input_id.version = 0x0100 
  120.  rcdev->dev.parent = &pdev->dev;  
  121.  rcdev->driver_name = GPIO_IR_DRIVER_NAME 
  122.  if (pdata->allowed_protos)  
  123.   rcdev->allowed_protocols = pdata->allowed_protos;  
  124.  else  
  125.   rcdev->allowed_protocols = RC_BIT_ALL 
  126.  rcdev->map_name = pdata->map_name ?: RC_MAP_EMPTY;   
  127.  gpio_dev->rcdevrcdev = rcdev;  
  128.  gpio_dev->gpio_nr = pdata->gpio_nr;  
  129.  gpio_dev->active_low = pdata->active_low;  
  130.  rc = gpio_request(pdata->gpio_nr, "gpio-ir-recv");  
  131.  if (rc < 0 
  132.   goto err_gpio_request;  
  133.  rc  = gpio_direction_input(pdata->gpio_nr);  
  134.  if (rc < 0 
  135.   goto err_gpio_direction_input;  
  136.  rc = rc_register_device(rcdev);  
  137.  if (rc < 0) {  
  138.   dev_err(&pdev->dev, "failed to register rc device\n");  
  139.   goto err_register_rc_device;  
  140.  }  
  141.  platform_set_drvdata(pdev, gpio_dev);  
  142.  rc = request_any_context_irq(gpio_to_irq(pdata->gpio_nr),  
  143.     gpio_ir_recv_irq,  
  144.    IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING,  
  145.      "gpio-ir-recv-irq", gpio_dev);  
  146.  if (rc < 0 
  147.   goto err_request_irq;  
  148.  return 0;  
  149. err_request_irq:  
  150.  rc_unregister_device(rcdev);  
  151.  rcdev = NULL 
  152. err_register_rc_device:  
  153. err_gpio_direction_input:  
  154.  gpio_free(pdata->gpio_nr);  
  155. err_gpio_request:  
  156.  rc_free_device(rcdev);  
  157. err_allocate_device:  
  158.  kfree(gpio_dev);  
  159.  return rc;  
  160.  
  161. static int gpio_ir_recv_remove(struct platform_device *pdev) 
  162.  
  163.  struct gpio_rc_dev *gpio_dev = platform_get_drvdata(pdev);  
  164.  free_irq(gpio_to_irq(gpio_dev->gpio_nr), gpio_dev);  
  165.  rc_unregister_device(gpio_dev->rcdev);  
  166.  gpio_free(gpio_dev->gpio_nr);  
  167.  kfree(gpio_dev);  
  168.  return 0; 
  169.  
  170. #ifdef CONFIG_PM  
  171. static int gpio_ir_recv_suspend(struct device *dev)  
  172.  
  173.  struct platform_device *pdev = to_platform_device(dev);  
  174.  struct gpio_rc_dev *gpio_dev = platform_get_drvdata(pdev);  
  175.  if (device_may_wakeup(dev))  
  176.   enable_irq_wake(gpio_to_irq(gpio_dev->gpio_nr));  
  177.  else  
  178.   disable_irq(gpio_to_irq(gpio_dev->gpio_nr));  
  179.  return 0;  
  180.  
  181. static int gpio_ir_recv_resume(struct device *dev)  
  182.  
  183.  struct platform_device *pdev = to_platform_device(dev);  
  184.  struct gpio_rc_dev *gpio_dev = platform_get_drvdata(pdev);  
  185.  if (device_may_wakeup(dev))  
  186.   disable_irq_wake(gpio_to_irq(gpio_dev->gpio_nr));  
  187.  else  
  188.   enable_irq(gpio_to_irq(gpio_dev->gpio_nr));  
  189.  return 0;  
  190.  
  191. static const struct dev_pm_ops gpio_ir_recv_pm_ops = {  
  192.  .suspend        = gpio_ir_recv_suspend 
  193.  .resume         = gpio_ir_recv_resume 
  194. }; 
  195. #endif  
  196. static struct platform_driver gpio_ir_recv_driver = {  
  197.  .probe  = gpio_ir_recv_probe 
  198.  .remove = gpio_ir_recv_remove 
  199.  .driver = {  
  200.   .name   = GPIO_IR_DRIVER_NAME 
  201.   .of_match_table = of_match_ptr(gpio_ir_recv_of_match),  
  202. #ifdef CONFIG_PM  
  203.   .pm = &gpio_ir_recv_pm_ops,  
  204. #endif 
  205.  },  
  206. };  
  207. module_platform_driver(gpio_ir_recv_driver);  
  208. MODULE_DESCRIPTION("GPIO IR Receiver driver");  
  209. MODULE_LICENSE("GPL v2"); 

ir-nec-decoder.c 

  1. /* ir-nec-decoder.c - handle NEC IR Pulse/Space protocol  
  2.  *  
  3.  * Copyright (C) 2010 by Mauro Carvalho Chehab  
  4.  *  
  5.  * This program is free software; you can redistribute it and/or modify  
  6.  *  it under the terms of the GNU General Public License as published by  
  7.  *  the Free Software Foundation version 2 of the License.  
  8.  *  
  9.  *  This program is distributed in the hope that it will be useful,  
  10.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of  
  11.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the  
  12.  *  GNU General Public License for more details.  
  13.  */  
  14. #include <linux/bitrev.h>  
  15. #include <linux/module.h>  
  16. #include "rc-core-priv.h"  
  17. #define NEC_NBITS  32  
  18. #define NEC_UNIT  562500  /* ns */  
  19. #define NEC_HEADER_PULSE (16 * NEC_UNIT)  
  20. #define NECX_HEADER_PULSE (8  * NEC_UNIT) /* Less common NEC variant */  
  21. #define NEC_HEADER_SPACE (8  * NEC_UNIT)  
  22. #define NEC_REPEAT_SPACE (4  * NEC_UNIT)  
  23. #define NEC_BIT_PULSE  (1  * NEC_UNIT)  
  24. #define NEC_BIT_0_SPACE  (1  * NEC_UNIT)  
  25. #define NEC_BIT_1_SPACE  (3  * NEC_UNIT)  
  26. #define NEC_TRAILER_PULSE (1  * NEC_UNIT)  
  27. #define NEC_TRAILER_SPACE (10 * NEC_UNIT) /* even longer in reality */  
  28. #define NECX_REPEAT_BITS 1  
  29. enum nec_state {  
  30.  STATE_INACTIVE,  
  31.  STATE_HEADER_SPACE,  
  32.  STATE_BIT_PULSE,  
  33.  STATE_BIT_SPACE,  
  34.  STATE_TRAILER_PULSE,  
  35.  STATE_TRAILER_SPACE,  
  36. };  
  37. /**  
  38.  * ir_nec_decode() - Decode one NEC pulse or space  
  39.  * @dev: the struct rc_dev descriptor of the device  
  40.  * @duration: the struct ir_raw_event descriptor of the pulse/space  
  41.  *  
  42.  * This function returns -EINVAL if the pulse violates the state machine  
  43.  */  
  44. static int ir_nec_decode(struct rc_dev *dev, struct ir_raw_event ev)  
  45.  
  46.  struct nec_dec *data = &dev->raw->nec;  
  47.  u32 scancode;  
  48.  u8 address, not_address, command, not_command;  
  49.  bool send_32bits = false 
  50.  if (!(dev->enabled_protocols & RC_BIT_NEC))  
  51.   return 0;  
  52.  if (!is_timing_event(ev)) {  
  53.   if (ev.reset)  
  54.    data->state = STATE_INACTIVE 
  55.   return 0;  
  56.  }  
  57.  IR_dprintk(2, "NEC decode started at state %d (%uus %s)\n",  
  58.      data->state, TO_US(ev.duration), TO_STR(ev.pulse));  
  59.  switch (data->state) {  
  60.  case STATE_INACTIVE:  
  61.   if (!ev.pulse)  
  62.    break;  
  63.   if (eq_margin(ev.duration, NEC_HEADER_PULSE, NEC_UNIT * 2)) {  
  64.    data->is_nec_x = false 
  65.    data->necx_repeat = false 
  66.   } else if (eq_margin(ev.duration, NECX_HEADER_PULSE, NEC_UNIT / 2))  
  67.    data->is_nec_x = true 
  68.   else  
  69.    break;  
  70.   data->count = 0 
  71.   data->state = STATE_HEADER_SPACE 
  72.   return 0;  
  73.  case STATE_HEADER_SPACE:  
  74.   if (ev.pulse)  
  75.    break;  
  76.   if (eq_margin(ev.duration, NEC_HEADER_SPACE, NEC_UNIT)) {  
  77.    data->state = STATE_BIT_PULSE 
  78.    return 0;  
  79.   } else if (eq_margin(ev.duration, NEC_REPEAT_SPACE, NEC_UNIT / 2)) {  
  80.    if (!dev->keypressed) {  
  81.     IR_dprintk(1, "Discarding last key repeat: event after key up\n");  
  82.    } else {  
  83.     rc_repeat(dev); 
  84.     IR_dprintk(1, "Repeat last key\n");  
  85.     data->state = STATE_TRAILER_PULSE 
  86.    }  
  87.    return 0;  
  88.   }  
  89.   break; 
  90.  case STATE_BIT_PULSE:  
  91.   if (!ev.pulse)  
  92.    break;  
  93.   if (!eq_margin(ev.duration, NEC_BIT_PULSE, NEC_UNIT / 2))  
  94.    break;  
  95.   data->state = STATE_BIT_SPACE 
  96.   return 0;  
  97.  case STATE_BIT_SPACE:  
  98.   if (ev.pulse)  
  99.    break;  
  100.   if (data->necx_repeat && data->count == NECX_REPEAT_BITS &&  
  101.    geq_margin(ev.duration, 
  102.     NEC_TRAILER_SPACE, NEC_UNIT / 2)) {  
  103.     IR_dprintk(1, "Repeat last key\n");  
  104.     rc_repeat(dev);  
  105.     data->state = STATE_INACTIVE 
  106.     return 0;  
  107.   } else if (data->count > NECX_REPEAT_BITS)  
  108.    data->necx_repeat = false 
  109.   data->bits <<= 1;  
  110.   if (eq_margin(ev.duration, NEC_BIT_1_SPACE, NEC_UNIT / 2) 
  111.    data->bits |= 1;  
  112.   else if (!eq_margin(ev.duration, NEC_BIT_0_SPACE, NEC_UNIT / 2))  
  113.    break;  
  114.   data->count++;  
  115.   if (data->count == NEC_NBITS)  
  116.    data->state = STATE_TRAILER_PULSE 
  117.   else  
  118.    data->state = STATE_BIT_PULSE 
  119.   return 0;  
  120.  case STATE_TRAILER_PULSE:  
  121.   if (!ev.pulse)  
  122.    break;  
  123.   if (!eq_margin(ev.duration, NEC_TRAILER_PULSE, NEC_UNIT / 2))  
  124.    break; 
  125.   data->state = STATE_TRAILER_SPACE 
  126.   return 0; 
  127.  case STATE_TRAILER_SPACE:  
  128.   if (ev.pulse)  
  129.    break;  
  130.   if (!geq_margin(ev.duration, NEC_TRAILER_SPACE, NEC_UNIT / 2))  
  131.    break;  
  132.   address     = bitrev8((data->bits >> 24) & 0xff);  
  133.   not_address = bitrev8((data->bits >> 16) & 0xff);  
  134.   command     = bitrev8((data->bits >>  8) & 0xff);  
  135.   not_command = bitrev8((data->bits >>  0) & 0xff);  
  136.   if ((command ^ not_command) != 0xff) {  
  137.    IR_dprintk(1, "NEC checksum error: received 0x%08x\n",  
  138.        data->bits);  
  139.    send_32bits = true 
  140.   }  
  141.   if (send_32bits) {  
  142.    /* NEC transport, but modified protocol, used by at  
  143.     * least Apple and TiVo remotes */  
  144.    scancode = data->bits;  
  145.    IR_dprintk(1, "NEC (modified) scancode 0x%08x\n", scancode);  
  146.   } else if ((address ^ not_address) != 0xff) {  
  147.    /* Extended NEC */  
  148.    scancode = address     << 16 |  
  149.        not_address <<  8 |  
  150.        command;  
  151.    IR_dprintk(1, "NEC (Ext) scancode 0x%06x\n", scancode);  
  152.   } else {  
  153.    /* Normal NEC */  
  154.    scancode = address << 8 | command;  
  155.    IR_dprintk(1, "NEC scancode 0x%04x\n", scancode);  
  156.   }  
  157.   if (data->is_nec_x)  
  158.    data->necx_repeat = true 
  159.   rc_keydown(dev, RC_TYPE_NEC, scancode, 0);  
  160.   data->state = STATE_INACTIVE 
  161.   return 0;  
  162.  }  
  163.  IR_dprintk(1, "NEC decode failed at count %d state %d (%uus %s)\n",  
  164.      data->count, data->state, TO_US(ev.duration), TO_STR(ev.pulse));  
  165.  data->state = STATE_INACTIVE 
  166.  return -EINVAL;  
  167.  
  168. static struct ir_raw_handler nec_handler = {  
  169.  .protocols = RC_BIT_NEC 
  170.  .decode  = ir_nec_decode 
  171. };  
  172. static int __init ir_nec_decode_init(void)  
  173.  
  174.  ir_raw_handler_register(&nec_handler);  
  175.  printk(KERN_INFO "IR NEC protocol handler initialized\n");  
  176.  return 0; 
  177.  
  178. static void __exit ir_nec_decode_exit(void)  
  179.  
  180.  ir_raw_handler_unregister(&nec_handler);  
  181.  
  182. module_init(ir_nec_decode_init);  
  183. module_exit(ir_nec_decode_exit);   
  184. MODULE_LICENSE("GPL");  
  185. MODULE_AUTHOR("Mauro Carvalho Chehab");  
  186. MODULE_AUTHOR("Red Hat Inc. (http://www.redhat.com)");  
  187. MODULE_DESCRIPTION("NEC IR protocol decoder"); 

參考文章中的dts文件: 

  1. gpio-ir-receiver {  
  2.     compatible = "gpio-ir-receiver" 
  3.     gpios = <&gpio4 19 GPIO_ACTIVE_HIGH>; //連接紅外的中斷引腳  
  4.     active_low = <1>;                     //紅外接收器是否將信號取反,有些紅外接收器會將接收到的高低電平信號反向輸出,比如我使用的hx1838紅外接收器  
  5.     linux,rc-map-name = "rc-hx18380-carmp3"; //紅外scancode與實際input_evnent code映射表名稱,要在rc_register_device注冊,具體見gpio-ir-recv.c  
  6.     allowed_protos = <0x100>; /*NEC protocol*/ //保留,驅動中并未使用  
  7. }; 

另一個文件里面調用的

ir-nec-decoder.c

這個函數是Linux內核中的紅外處理申請函數

這里主要是注冊一個解碼的結構體

ir-nec-decoder.c

3.中斷處理程序解析

gpio-ir-recv.c

ir_raw_event_store_edge() 這個函數用來計算電平的持續時間。

ir_raw_event_handle() 用來處理這個電平表示什么含義。

驅動程序里面,首先是判斷當前GPIO電平,如果是低電平,就進入紅外解析,如果不是,或者獲取失敗,就退出程序。

4.紅外數據處理程序解析

內核專門開了一個線程來處理數據解析

rc-ir-raw.c

處理函數其實就是處理電平時間長短來決定數字信號

ir-nec-decoder.c

這里是判斷頭,這個時間和9ms進行比較

9ms 從哪里來的,可以看看這里

ir-nec-decoder.c

拿到頭后,這個switch函數就繼續往下跑

ir-nec-decoder.c

然后就是判斷 1 和 0  的時候了

ir-nec-decoder.c

上面那個就是1,下面那個就是0。

4.然后數據怎么上報呢?

ir-nec-decoder.c

這里是在另一個模塊中注冊的映射

不同的紅外鍵值對應不同的上報按鍵鍵值

rc-trekstor.c

 

 

責任編輯:龐桂玉 來源: 良許Linux
相關推薦

2012-07-06 15:23:28

Linux集群

2010-05-20 08:49:52

MyEclipse8.

2009-12-10 13:43:08

使用PHPExcel

2010-08-03 12:53:51

FlexBuilder

2016-05-12 14:45:29

IBM大型機LinuxONE

2011-01-27 11:18:27

三級信息管理

2011-01-17 11:33:01

三級信息管理

2011-01-20 11:14:50

三級信息管理

2015-03-27 22:23:28

FreeSyncLiquidVR

2010-06-17 15:54:24

UML總結

2009-12-29 16:36:47

Silverlight

2021-08-03 15:10:26

Linux代碼驅動

2021-08-10 11:30:30

Linux代碼中斷控制器

2010-02-22 17:13:40

WCF會話狀態

2009-12-31 16:50:02

Silverlight

2017-09-30 10:17:24

云計算PaaS容器云

2010-08-09 10:03:43

FlexBuilder

2009-12-24 09:48:29

WPF分割條

2011-09-16 11:23:10

布線布線系統線纜

2010-01-28 13:50:03

Android移植
點贊
收藏

51CTO技術棧公眾號

国产精品羞羞答答| 中文日韩电影网站| 国产男女在线观看| 国产毛片av在线| 国产在线精品一区二区| 欧美日韩成人网| 中文字幕高清视频| 精品中文在线| 色婷婷国产精品| 日韩中文字幕亚洲精品欧美| 你懂得网站在线| 国产麻豆精品在线| 国产精品精品久久久久久| 日本a级片视频| 国产99久久精品一区二区300| 欧美日韩精品欧美日韩精品一 | 欧美日韩调教| 一本色道久久88亚洲综合88 | 久久亚洲捆绑美女| 91精品久久久久久久久久久| 日韩 欧美 综合| 亚洲a在线视频| 国产性色av一区二区| 26uuu国产| 久久久久伊人| 色视频欧美一区二区三区| 亚洲AV无码成人精品一区| 美州a亚洲一视本频v色道| 国产一区二区电影| 国产欧美va欧美va香蕉在线| 久久夜靖品2区| 女同性一区二区三区人了人一| 亚洲视频国产视频| 国产真实乱人偷精品| 欧美第一在线视频| 欧美日韩国产在线播放网站| 国产91在线视频观看| 手机av免费在线| 亚洲欧美自拍偷拍色图| 日韩国产高清一区| 日本大臀精品| 99这里只有精品| 国产一区二区三区四区hd | 国产视频精品自拍| 免费黄色三级网站| 超碰在线一区| 日韩精品一区二区三区视频播放 | 国产精品久久久久久久免费看| 美女被久久久| 69av在线视频| 日韩在线观看第一页| 亚洲国产午夜| 97超碰色婷婷| 少妇一级淫片免费放中国 | 亚洲成人自拍偷拍| 国产玉足脚交久久欧美| 性欧美ⅴideo另类hd| 亚洲精品五月天| 久久精品在线免费视频| 成人免费网址| 亚洲一区在线观看视频| 欧美无砖专区免费| 91九色美女在线视频| 天天操天天干天天综合网| 精品少妇人妻av免费久久洗澡| av资源在线播放| 欧美午夜女人视频在线| 波多野结衣作品集| 国产一区影院| 日韩丝袜情趣美女图片| 午夜性福利视频| 欧美日韩精品一区二区三区在线观看| 亚洲国产成人91精品| av无码av天天av天天爽| 红桃视频在线观看一区二区| 一本久久综合亚洲鲁鲁| 永久久久久久久| 亚洲高清不卡| 日韩美女视频中文字幕| 伊人久久一区二区| 国产福利91精品一区| 国产伦精品一区二区三区免费视频 | 另类欧美小说| 亚洲成人三级| 亚洲国产精品一区二区久久 | 69堂精品视频在线播放| 欧美高清你懂得| 日本五十肥熟交尾| 欧洲激情综合| 久久久久久18| 奴色虐av一区二区三区| 久久成人久久爱| 激情小说综合网| 不卡在线视频| 亚洲国产日韩av| 黄色片视频在线播放| 亚洲电影二区| 亚洲精选在线观看| 在线观看美女av| 先锋影音久久久| 成人午夜在线视频一区| 色视频精品视频在线观看| 国产精品的网站| 无码专区aaaaaa免费视频| yw.尤物在线精品视频| 欧美不卡视频一区| 四虎成人免费影院| 中文一区在线| 成人久久一区二区三区| 欧美日韩在线中文字幕| 一区二区三区中文免费| 久久久久久三级| 国产一区在线电影| 精品国产区一区二区三区在线观看| 国产一级特黄毛片| 狠狠色丁香婷婷综合久久片| 精品一区二区日本| 女人天堂av在线播放| 欧美亚洲禁片免费| 男人天堂av电影| 亚洲高清成人| 91九色蝌蚪嫩草| 日本成人在线播放| 色av一区二区| 亚洲第一成人网站| 亚洲精品日韩久久| 亚洲最大成人网色| 欧美尤物美女在线| 在线观看日韩精品| 精品无人区无码乱码毛片国产| 国产精品va| 亚洲伊人一本大道中文字幕| 国产高清视频在线播放| 色婷婷综合久色| 欧美bbbbb性bbbbb视频| 亚洲美女黄网| 国产福利不卡| 日皮视频在线观看| 日韩欧美中文一区二区| 日本黄色片免费观看| 麻豆成人久久精品二区三区小说| 农村寡妇一区二区三区| 色资源二区在线视频| 亚洲成人激情视频| 日本网站免费观看| 99精品久久99久久久久| 欧美 日本 亚洲| 日韩超碰人人爽人人做人人添| 欧美精品videosex牲欧美| 亚洲国产欧美另类| 亚洲在线视频免费观看| 国产女主播在线播放| 亚洲国产1区| 国产伦精品一区二区三区免费视频 | 精品人妻一区二区三区四区在线| 国产精品超碰| 91精品国产乱码久久久久久久久| 日韩中文字幕免费在线观看| 亚洲成在人线在线播放| 三级电影在线看| 久久久精品网| 亚洲国产精品日韩| 精品91福利视频| 欧美精品www| 色哟哟在线观看| 欧美三级欧美一级| www深夜成人a√在线| 国产91精品在线观看| www.99热这里只有精品| 妖精视频一区二区三区| 国产精品福利小视频| 欧美性videos| 亚洲精品一区二区三区99| 韩国av免费观看| 国产日韩欧美高清在线| 午夜精品中文字幕| 午夜亚洲福利| 免费一区二区三区| 精品久久毛片| 欧美精品激情在线观看| 青青久在线视频| 欧美精品丝袜中出| 日韩成人一区二区三区| 国产女主播在线一区二区| 日韩av一卡二卡三卡| 亚洲一级高清| 亚洲国产精品www| 电影一区二区在线观看| 国产成人精品久久二区二区| 成年视频在线观看| 亚洲欧美精品在线| 99精品在线看| 欧美性xxxx| 亚洲国产精品免费在线观看| 99re这里只有精品6| 日本中文字幕二区| 午夜亚洲伦理| 欧美a级黄色大片| 国产亚洲一区二区三区不卡| 97夜夜澡人人双人人人喊| 日韩成人av电影| 欧美大片网站在线观看| 国内三级在线观看| 亚洲电影免费观看| 国产乱子伦精品无码码专区| 精品国产电影一区| www色aa色aawww| 久久久五月婷婷| 97精品人人妻人人| 狠狠色丁香久久婷婷综| 国产免费黄视频| 亚洲欧美综合国产精品一区| 三区精品视频| 亲子伦视频一区二区三区| 69堂成人精品视频免费| 黄色精品视频| 国产成人精品电影久久久| 黄页网站大全在线免费观看| 日韩亚洲综合在线| 高清毛片在线看| 国产午夜精品久久久 | 祥仔av免费一区二区三区四区| 98视频在线噜噜噜国产| 四虎影视国产在线视频| 日韩最新中文字幕电影免费看| 色播色播色播色播色播在线| 精品国产一区二区三区久久久蜜月| 91在线公开视频| 欧美日韩中文精品| 无码视频在线观看| 欧美性高跟鞋xxxxhd| 日本少妇吞精囗交| 亚洲综合男人的天堂| 欧美老熟妇一区二区三区| 成人免费小视频| 男人在线观看视频| 国产精品盗摄一区二区三区| 欧美三级视频网站| 国产欧美一区二区三区在线看蜜臀 | 99久久精品日本一区二区免费| 欧美日韩一区二区三区不卡| 狠狠躁夜夜躁人人爽视频| 在线欧美一区二区| 欧美日韩在线视频播放| 在线观看视频一区二区| 日韩欧美一级大片| 欧美日韩精品福利| 国产又黄又粗又猛又爽| 91麻豆精品国产91久久久更新时间 | 欧美一级二级三级蜜桃| 国产高清免费av| 欧美va日韩va| 无码国产精品高潮久久99| 亚洲国产私拍精品国模在线观看| 日韩中文字幕观看| 亚洲人免费视频| 超碰免费在线| 久青草国产97香蕉在线视频| 亚洲羞羞网站| 国产做受高潮69| 厕沟全景美女厕沟精品| 日韩美女视频免费在线观看| 国产亚洲精彩久久| 亚洲自拍欧美色图| 巨人精品**| 青青成人在线| 我不卡伦不卡影院| 久久99久久久久久| 亚洲一区二区三区高清不卡| 日本黄网站免费| 精品一区二区三区香蕉蜜桃| 成人免费播放视频| 91网上在线视频| 羞羞在线观看视频| 亚洲国产人成综合网站| 国产伦精品一区二区三区视频网站| 日韩欧美在线视频观看| 一级黄色片免费看| 亚洲第一天堂av| 最新av网站在线观看 | 黄色精品视频| av一区观看| 国产99精品一区| 国产女教师bbwbbwbbw| 男人的天堂亚洲| 午夜影院免费观看视频| 99精品欧美一区二区蜜桃免费| 夫妇交换中文字幕| 亚洲一区二区黄色| www.亚洲激情| 亚洲成人黄色在线观看| 69av在线| 91精品国产91久久久久久吃药| 欧美激情啪啪| 农村寡妇一区二区三区| 女人天堂亚洲aⅴ在线观看| 2022亚洲天堂| 国产精品一区在线观看乱码| 性欧美丰满熟妇xxxx性仙踪林| 中文字幕在线不卡一区| av大片在线免费观看| 欧美一级xxx| 成年人在线观看视频| 久久免费国产精品1| 激情久久一区二区| 欧美成ee人免费视频| 午夜日韩福利| 国产野外作爱视频播放| av在线不卡网| 久久久久99精品成人片试看| 91国偷自产一区二区使用方法| 午夜免费福利视频| 日韩有码在线观看| 天堂久久午夜av| 黄色99视频| 狠狠综合久久av一区二区老牛| 色噜噜狠狠一区二区| 91在线国产观看| 国产一级特黄视频| 欧美一卡二卡在线| 免费在线看黄色| 国产精品老牛影院在线观看| 欧美黄色网视频| 久青草视频在线播放| 韩国午夜理伦三级不卡影院| 国产精品理论在线| 91久久免费观看| 国产区视频在线播放| 欧美一区二区视频97| 嫩草国产精品入口| 国产精品成人久久电影| 国产suv精品一区二区6| 高h视频免费观看| 日韩三级视频中文字幕| 被灌满精子的波多野结衣| 性感女国产在线| 97人人香蕉| 国产一区亚洲| 在线观看亚洲免费视频| 一区二区三区在线免费播放| 国产一区二区在线播放视频| 色综合伊人色综合网| 成人国产综合| 亚洲在线播放电影| 九九九久久久精品| 黄色片在线观看网站| 日韩欧美一卡二卡| 性欧美1819sex性高清大胸| 91视频最新| 伊人久久久大香线蕉综合直播| 精品国产一二区| 激情亚洲一区二区三区四区| 性感美女一级片| 日本一本a高清免费不卡| 深爱激情综合| 亚洲国产成人va在线观看麻豆| 国产精品毛片大码女人| 国产精品视频一区二区三区,| 久久精品美女视频网站| 免费一区二区三区在线视频| 狠狠精品干练久久久无码中文字幕| 高清国产一区二区| 六月丁香在线视频| 国产午夜精品视频免费不卡69堂| 青青伊人久久| 黄色录像特级片| 99精品热视频| 中文字幕一级片| 免费不卡欧美自拍视频| 黄色美女久久久| 能在线观看的av网站| 日韩一区欧美小说| 亚洲成a人片在线| 日本乱人伦a精品| 我不卡影院28| 日韩一级视频在线观看| 欧美色综合久久| 欧美理论电影| 日韩av在线电影观看| 国产一区二区中文字幕| 日韩欧美高清在线观看| 国产一区二区三区日韩欧美| 精品国产伦一区二区三区观看说明| 岛国大片在线播放| 亚洲国产精品二十页| 亚洲精品网站在线| 国产99视频精品免视看7| 久久久9色精品国产一区二区三区| 亚洲黄色小说在线观看| 色婷婷久久久久swag精品| 麻豆传媒视频在线观看免费| 精品亚洲欧美日韩| 国内久久婷婷综合| 国产精品国产三级国产专区52| 综合欧美国产视频二区| 国产女人18毛片水真多18精品| 亚洲娇小娇小娇小| 欧美日韩免费在线观看| 亚洲性图自拍| 亚洲一区三区电影在线观看|