สารบัญ:

WIDI - HDMI ไร้สายโดยใช้ Zybo (บอร์ดพัฒนา Zynq): 9 ขั้นตอน (พร้อมรูปภาพ)
WIDI - HDMI ไร้สายโดยใช้ Zybo (บอร์ดพัฒนา Zynq): 9 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: WIDI - HDMI ไร้สายโดยใช้ Zybo (บอร์ดพัฒนา Zynq): 9 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: WIDI - HDMI ไร้สายโดยใช้ Zybo (บอร์ดพัฒนา Zynq): 9 ขั้นตอน (พร้อมรูปภาพ)
วีดีโอ: Unboxing TySOM-3A-ZU19EG Embedded Development Board 2024, กรกฎาคม
Anonim
WIDI - HDMI ไร้สายโดยใช้ Zybo (บอร์ดพัฒนา Zynq)
WIDI - HDMI ไร้สายโดยใช้ Zybo (บอร์ดพัฒนา Zynq)
WIDI - HDMI ไร้สายโดยใช้ Zybo (บอร์ดพัฒนา Zynq)
WIDI - HDMI ไร้สายโดยใช้ Zybo (บอร์ดพัฒนา Zynq)

คุณเคยคิดอยากจะเชื่อมต่อทีวีกับพีซีหรือแล็ปท็อปเป็นจอภาพภายนอกแต่ไม่อยากมีสายที่น่ารำคาญขวางทางใช่ไหม ถ้าใช่ บทช่วยสอนนี้เหมาะสำหรับคุณเท่านั้น! แม้ว่าจะมีผลิตภัณฑ์บางอย่างที่บรรลุเป้าหมายนี้ แต่โปรเจ็กต์ DIY ก็น่าพึงพอใจมากกว่าและอาจถูกกว่ามาก

แนวคิดนี้แตกต่างจากผลิตภัณฑ์อย่าง Chromecast เนื่องจากมีวัตถุประสงค์เพื่อใช้แทนสาย HDMI ที่เชื่อมต่อกับจอภาพแทนที่จะเป็นอุปกรณ์สตรีม

โครงการของเราสร้างขึ้นเป็นโครงการสุดท้ายสำหรับหลักสูตรระบบปฏิบัติการตามเวลาจริงที่มหาวิทยาลัยโพลีเทคนิครัฐแคลิฟอร์เนีย เมืองซาน หลุยส์ โอบิสโป

เป้าหมายของโครงการคือการใช้บอร์ด Digilent Zybo สองบอร์ดเพื่อทำหน้าที่เป็นอินเทอร์เฟซการสื่อสารไร้สายระหว่างอุปกรณ์ส่งสัญญาณ HDMI (พีซี บลูเรย์ ฯลฯ) ไปยังอุปกรณ์รับสัญญาณ HDMI (จอภาพเดสก์ท็อป โปรเจ็กเตอร์ ทีวี ฯลฯ)

Digilent Zybo หนึ่งตัวจะเชื่อมต่อผ่าน HDMI กับอุปกรณ์ส่งสัญญาณ และอีกตัวหนึ่งจะเชื่อมต่อผ่าน HDMI กับอุปกรณ์รับ

การสื่อสารแบบไร้สายจะทำโดยใช้เครือข่ายไร้สายในพื้นที่เฉพาะสำหรับเครื่องส่งและตัวรับสัญญาณ โดยไม่ต้องกำหนดเส้นทางผ่านเราเตอร์ที่บ้านหรืออุปกรณ์อื่นๆ โมดูลไร้สายที่ใช้สำหรับโครงการนี้คือ tplink wr802n nanorouter ซึ่งหนึ่งในนั้นทำงานเป็นจุดเชื่อมต่อเพื่อสร้างเครือข่าย และอีกส่วนหนึ่งทำงานเป็นไคลเอนต์เพื่อเชื่อมต่อกับเครือข่าย นาโนเราเตอร์แต่ละตัวจะเชื่อมต่อผ่านสายอีเทอร์เน็ตกับบอร์ด Zybo ตัวใดตัวหนึ่ง เมื่อเชื่อมต่อกับเราเตอร์เหล่านี้ อุปกรณ์จะสื่อสารผ่าน TCP ราวกับว่าพวกเขาเชื่อมต่อกับสายเคเบิลอีเธอร์เน็ตเพียงเส้นเดียว (หมายถึงการกำหนดค่าเดียวที่จำเป็นในการสร้างการเชื่อมต่อคือที่อยู่ IP ของไคลเอ็นต์)

แม้ว่าเป้าหมายของโครงการคือการอำนวยความสะดวกในการสตรีมวิดีโอ 1080x720 @ 60Hz แต่ก็ไม่สามารถทำได้เนื่องจากข้อจำกัดแบนด์วิดท์ในเครือข่ายไร้สายและขาดการบีบอัดวิดีโอแบบเรียลไทม์เพื่อลดข้อมูลที่ต้องใช้ในการส่ง แต่โปรเจ็กต์นี้ทำหน้าที่เป็นกรอบสำหรับการพัฒนาในอนาคตเพื่อให้บรรลุเป้าหมายนี้ เนื่องจากมีข้อจำกัดอย่างมากในด้านอัตราเฟรมในการสตรีมข้อมูล HDMI อย่างเหมาะสมตามที่ตั้งใจไว้

ข้อกำหนดของโครงการ:

2x Digilent Zybo Development Boards (ต้องมีพอร์ต HDMI อย่างน้อยหนึ่งพอร์ต)

2x สาย HDMI

สาย microusb 2x (เพื่อเชื่อมต่อ Zybo กับพีซีเพื่อการพัฒนา)

2x tplink wr802n nanorouters (รวมถึง adtl. 2x microusb และอะแดปเตอร์จ่ายไฟที่ผนัง)

2x สายอีเธอร์เน็ต

***หมายเหตุ: บทช่วยสอนนี้ถือว่าคุ้นเคยกับชุดการออกแบบ Vivado และประสบการณ์ในการสร้างโครงการใหม่และการออกแบบบล็อก***

ขั้นตอนที่ 1: กำหนดค่า Zynq Programmable Logic สำหรับเครื่องส่งสัญญาณ

กำหนดค่า Zynq Programmable Logic สำหรับเครื่องส่งสัญญาณ
กำหนดค่า Zynq Programmable Logic สำหรับเครื่องส่งสัญญาณ
กำหนดค่า Zynq Programmable Logic สำหรับเครื่องส่งสัญญาณ
กำหนดค่า Zynq Programmable Logic สำหรับเครื่องส่งสัญญาณ
กำหนดค่า Zynq Programmable Logic สำหรับเครื่องส่งสัญญาณ
กำหนดค่า Zynq Programmable Logic สำหรับเครื่องส่งสัญญาณ

แนวทางของเราในการพัฒนาตรรกะที่ตั้งโปรแกรมได้ของเครื่องส่งสัญญาณคือดำเนินการส่งสัญญาณผ่าน hdmi-to-hdmi จากพีซีเพื่อตรวจสอบโดยใช้บล็อก Video Direct Memory Access (VDMA) สองบล็อก บล็อกหนึ่งสำหรับเขียนและอีกบล็อกหนึ่งสำหรับอ่าน

ทั้งคู่ถูกเลือกสำหรับการวิ่งอิสระ 3 โหมดเฟรมบัฟเฟอร์ (0-1-2) เนื่องจากแกนวิดีโอได้รับการปรับให้เหมาะสมสำหรับ 60 เฟรมต่อวินาที ซึ่งหมายความว่า VDMA จะเขียนหรืออ่านไปยังเฟรมใหม่ทุกๆ 16.67 ms ตามลำดับ: 0, 1, 2, 0, 1, 2, 0, 1, 2 ตำแหน่งหน่วยความจำ DDR สำหรับแต่ละเฟรมจะแตกต่างกันสำหรับ VDMA ทั้งสอง เนื่องจากไม่มีการซิงโครไนซ์ซึ่งกันและกันอีกต่อไป แต่จะใช้ตัวจับเวลาฮาร์ดแวร์ (TTC1) ซึ่งกำหนดค่าไว้สำหรับ 60 Hz เพื่อซิงโครไนซ์การเคลื่อนไหวของข้อมูลระหว่างตำแหน่งหน่วยความจำสองตำแหน่ง

ภาพด้านบนแสดง 3 เฟรม ขนาด และจำนวนหน่วยความจำที่แต่ละเฟรมต้องการ (ทางด้านขวาของเฟรม) หากเรากำหนดการเขียน VDMA ให้กับตำแหน่งหน่วยความจำเหล่านี้ เราก็สามารถกำหนดตำแหน่งหน่วยความจำ VDMA ที่อ่านได้นอกเหนือจากชุดนี้ กล่าวคือเริ่มด้วย 0x0B000000 แต่ละเฟรมประกอบด้วย 1280*720 พิกเซล และแต่ละพิกเซลประกอบด้วยสีแดง สีเขียว และสีน้ำเงิน 8 บิต รวมเป็น 24 บิต ซึ่งหมายความว่าเฟรมประกอบด้วย 1280*720*3 ไบต์ (2.76 MB)

ภายใน IRQ ของตัวจับเวลา ซึ่งอธิบายไว้ในการตั้งค่าไดรเวอร์ VDMA จะจัดการการคัดลอกข้อมูลระหว่างตำแหน่งหน่วยความจำ VMDA สองตำแหน่ง VDMA ให้ตัวชี้ไปยังเฟรมปัจจุบันที่กำลังเขียนหรืออ่านจาก เฟรมแสดงด้วยรหัสสีเทาซึ่งแปลงเป็นซอฟต์แวร์ คำจำกัดความโค้ดสีเทาสำหรับการกำหนดค่าบัฟเฟอร์เฟรม 3 รายการมีอยู่ในคู่มือผลิตภัณฑ์ AXI VDMA ในภาคผนวก C

ซึ่งช่วยให้เราสามารถคัดลอกเนื้อหาที่เขียนไปยังหน่วยความจำโดยไม่ต้องอ่านจากเฟรมที่กำลังเขียนอยู่

***โปรดทราบว่าการอ่าน VDMA จะไม่ถูกใช้เมื่อส่งข้อมูลผ่านเครือข่ายไร้สาย มีวัตถุประสงค์เพียงเพื่อตรวจสอบการทำงานที่เหมาะสมของการคัดลอกหน่วยความจำจากการเขียน VMDA ควรปิดใช้งาน VMDA ที่อ่านแล้ว ***

ต่อไปนี้คือขั้นตอนในการสร้างบล็อกการออกแบบเครื่องส่งสัญญาณ:

  1. เมื่อสร้างโปรเจ็กต์ใหม่ การกำหนดชิปหรือบอร์ดให้กับโปรเจ็กต์ถือเป็นความคิดที่ดี ลิงค์นี้อธิบายวิธีการเพิ่มไฟล์บอร์ดใหม่ให้กับไดเร็กทอรี Vivado และเชื่อมโยงบอร์ดที่ถูกต้องกับโปรเจ็กต์ของคุณ จะมีประโยชน์เมื่อเพิ่มบล็อกระบบการประมวลผลและเปลี่ยนจากฮาร์ดแวร์เป็นซอฟต์แวร์ (ฝั่ง SDK)
  2. เพิ่มบล็อกต่อไปนี้:

    • dvi2rgb
    • วิดีโอใน Axi4-stream
    • ตัวควบคุมเวลา
    • axi4-stream เพื่อ vid ออก
    • rgb2dvi
    • AXI VDMA x2
    • AXI GPIO x2
    • ตัวช่วยสร้างนาฬิกา
    • คงที่
    • ระบบประมวลผล Zynq
  3. เมื่อเพิ่มระบบการประมวลผล ให้คลิก "เรียกใช้การบล็อกอัตโนมัติ" จากแถบสีเขียวด้านบน และตรวจสอบว่าได้เลือกตัวเลือก "ใช้การตั้งค่าบอร์ดล่วงหน้า" แล้ว ปล่อยให้ทุกอย่างเป็นค่าเริ่มต้น
  4. รูปภาพของหน้าต่างการกำหนดค่าบล็อกแต่ละอันสามารถดูได้ในภาพด้านบน หากคุณไม่เห็นรูปภาพสำหรับหน้าต่างใดหน้าต่างหนึ่ง ให้ปล่อยไว้เป็นค่าเริ่มต้น
  5. เริ่มกำหนดค่าระบบประมวลผล Zynq:

    • ในการกำหนดค่า PS-PL AXI ไม่ปลอดภัย เปิดใช้งาน GP Master AXI เปิดใช้งาน M AXI GP0 Interface
    • ในการกำหนดค่า PS-PL ส่วนต่อประสาน HP Slave AXI ให้เปิดใช้งานทั้ง HP0 และ HP1
    • ในการกำหนดค่า MIO ตรวจสอบให้แน่ใจว่า ENET0 ถูกเปิดใช้งานภายใต้ I/O Peripherals จากนั้น Application Processor Unit เปิดใช้งาน Timer0
    • ใน Clock Configuration PL Fabric Clocks ให้เปิดใช้งาน FCLK_CLK0 และตั้งค่าเป็น 100 MHz
    • คลิกตกลง
  6. ก่อนคลิก "เรียกใช้การเชื่อมต่ออัตโนมัติ" อย่าลืมเชื่อมต่อบล็อกวิดีโอตามที่เห็นในภาพการออกแบบบล็อก TX ด้านบน คุณจะต้องเปลี่ยนชื่อค่าคงที่เป็น VDD และตั้งค่าเป็น 1 เชื่อมต่อบล็อกวิดีโอตามลำดับ
  7. สร้างนาฬิกา HDMI TMDS และหมุดข้อมูลภายนอกบนบล็อก rgb2dvi และ dvi2rgb
  8. สร้างพอร์ตอินพุตและเอาต์พุตสำหรับสัญญาณตรวจจับฮอตปลั๊ก (HPD) และเชื่อมต่อเข้าด้วยกัน ซึ่งกำหนดไว้ในไฟล์ข้อจำกัด
  9. นาฬิกาพิกเซลถูกกู้คืนจาก TMDS_Clk_p ซึ่งสร้างขึ้นในไฟล์ข้อจำกัด นี่จะเป็น 74.25 MHz ตามความละเอียด 720p สิ่งสำคัญคือต้องเชื่อมต่อนาฬิกาพิกเซล (จากบล็อก dvi2rgb) กับพินต่อไปนี้:

    • vid_io_in_clk (vid ในบล็อกสตรีม axi)
    • vid_io_out_clk (สตรีมแกนเพื่อแยกบล็อกออก)
    • clk (ตัวควบคุมเวลา)
    • PixelClk (rgb2dvi)
  10. ***หมายเหตุ: ในปัจจุบัน ในการเปิดใช้งานการกู้คืนนาฬิกาพิกเซล ขั้วต่อ HDMI rx และ tx จะต้องเสียบเข้ากับแหล่งสัญญาณ/ซิงก์ที่ใช้งานอยู่ วิธีหนึ่งในการแก้ปัญหานี้คือแยกบล็อก rx และ tx ของวิดีโอออกเป็นโดเมนนาฬิกาที่ต่างกัน (กล่าวคือ สร้างนาฬิกา 74.25 MHz ใหม่เพื่อป้อนไปยังบล็อก tx)***
  11. ถัดไป ตั้งค่าตัวช่วยสร้างนาฬิกาเพื่อให้คุณมีอินพุต 100 MHz (แหล่งบัฟเฟอร์ทั่วโลก) และสัญญาณนาฬิกาเอาต์พุต 3 ตัวที่ 50 MHz (นาฬิกา AXI-Lite), 150 MHz (นาฬิกา AXI4-Stream), 200 MHz (พิน dvi2rgb RefClk)
  12. เชื่อมต่อพินระบบประมวลผล FCLK_CLK0 กับอินพุตตัวช่วยสร้างนาฬิกา
  13. ณ จุดนี้ คลิก "เรียกใช้การเชื่อมต่ออัตโนมัติ" จากแถบสีเขียวที่ด้านบนของหน้าต่างการออกแบบ เป็นความคิดที่ดีที่จะทำสิ่งนี้ครั้งละหนึ่งบล็อกและทำตามภาพการออกแบบบล็อก TX ด้านบน
  14. เครื่องมือนี้จะพยายามเพิ่ม AXI Interconnect ซึ่งทำหน้าที่เป็น master/slave interconnect สำหรับบล็อกที่ใช้ AXI-Lite bus (VDMA และ GPIO)
  15. นอกจากนี้ยังจะเพิ่ม AXI SmartConnect ซึ่งทำหน้าที่เป็น master/slave interconnect สำหรับ AXI4-Stream และอินเทอร์เฟซโปรเซสเซอร์ประสิทธิภาพสูงที่ใช้โดย VDMA (สตรีมไปยัง Memory Map และในทางกลับกัน)
  16. เครื่องมือนี้จะเพิ่มการรีเซ็ตระบบโปรเซสเซอร์ด้วย ตรวจสอบให้แน่ใจว่าสิ่งนี้เชื่อมต่อกับ VDMA, GPIO และบล็อกที่เกี่ยวข้องกับโปรเซสเซอร์เท่านั้น อย่าเชื่อมต่อกับบล็อกวิดีโอใด ๆ (เช่น dvi2rgb, ตัวควบคุมเวลา, vid เพื่อสตรีม ฯลฯ)
  17. เมื่อการเชื่อมต่ออัตโนมัติเสร็จสมบูรณ์ ให้ตรวจสอบว่าการเชื่อมต่อตรงกับรูปภาพการออกแบบบล็อก TX คุณจะสังเกตเห็นบล็อก System ILA พิเศษที่ไม่ได้กล่าวถึง นี่เป็นการดีบักเท่านั้นและไม่จำเป็นในตอนนี้ มันใช้การรีเซ็ตโปรเซสเซอร์ 150M ดังนั้นจึงไม่จำเป็นเช่นกัน ทุกที่ที่คุณเห็น "แมลง" สีเขียวเล็กๆ บนรถบัส นั่นเป็นเพราะ ILA และสามารถเพิกเฉยได้
  18. ขั้นตอนสุดท้ายคือการคลิกขวาที่การออกแบบบล็อกในแผนผังแหล่งที่มาของโปรเจ็กต์ และเลือก "สร้าง HDL Wrapper" หากคุณวางแผนที่จะเพิ่มตรรกะให้กับ wrapper จะถูกเขียนทับทุกครั้งที่มีการเลือก
  19. ดูส่วนการตั้งค่าไดรเวอร์ VDMA สำหรับรายละเอียดเกี่ยวกับฝั่ง SDK

นาฬิกาและการรีเซ็ต

ฉันพบว่าส่วนที่สำคัญที่สุดของโปรเจ็กต์ลอจิกที่ตั้งโปรแกรมได้คือการพิจารณาโดเมนนาฬิกาและสัญญาณรีเซ็ตอย่างรอบคอบ หากสิ่งเหล่านี้ได้รับการกำหนดค่าอย่างเหมาะสม แสดงว่าคุณมีช็อตที่ดีในการทำให้การออกแบบของคุณทำงาน

นาฬิกาพิกเซลและไทม์มิ่งถูกล็อก

เพื่อตรวจสอบว่าสัญญาณบางอย่างทำงานอยู่ เป็นความคิดที่ดีที่จะผูกสัญญาณเหล่านี้กับ LED (นาฬิกา รีเซ็ต ล็อค ฯลฯ) สัญญาณสองสัญญาณที่ฉันพบว่ามีประโยชน์ในการติดตามบนบอร์ดเครื่องส่งสัญญาณคือนาฬิกาพิกเซลและสัญญาณ "ล็อก" บนบล็อก AXI4-Stream ไปยังวิดีโอเอาท์ ซึ่งบอกคุณว่าเวลาของวิดีโอได้รับการซิงโครไนซ์กับตัวควบคุมเวลาและแหล่งสัญญาณวิดีโอ ข้อมูล. ฉันได้เพิ่มตรรกะบางอย่างให้กับ wrapper บล็อกการออกแบบที่ติดตามนาฬิกาพิกเซลโดยใช้สัญญาณ PixelClkLocked บนบล็อก dvi2rgb เพื่อรีเซ็ต ฉันได้แนบไฟล์เป็น hdmi_wrapper.v ที่นี่ ไฟล์ข้อจำกัดถูกแนบมาไว้ที่นี่ด้วย

ขั้นตอนที่ 2: กำหนดค่า Zynq Programmable Logic สำหรับตัวรับ

กำหนดค่า Zynq Programmable Logic สำหรับตัวรับ
กำหนดค่า Zynq Programmable Logic สำหรับตัวรับ
กำหนดค่า Zynq Programmable Logic สำหรับตัวรับ
กำหนดค่า Zynq Programmable Logic สำหรับตัวรับ
กำหนดค่า Zynq Programmable Logic สำหรับตัวรับ
กำหนดค่า Zynq Programmable Logic สำหรับตัวรับ

บล็อก Programmable Logic สำหรับเครื่องรับง่ายกว่า ความแตกต่างที่สำคัญ นอกเหนือจากบล็อกอินพุต hdmi ที่ขาดหายไปคือการไม่มีนาฬิกาพิกเซลที่กู้คืน ด้วยเหตุนี้เราจึงต้องสร้างของเราเองจากตัวช่วยสร้างนาฬิกา การออกแบบนี้ควรทำในโครงการแยกจากเครื่องส่งสัญญาณ เพื่อจุดประสงค์ของเรา โครงการเครื่องรับติดตามบอร์ด Zybo 7Z-20 ในขณะที่เครื่องส่งติดตามบอร์ด Z7-10 FPGA บนกระดานต่างกัน ดังนั้น…โปรดระวัง

นี่คือขั้นตอนในการสร้าง Receiver Design Block:

  1. เพิ่มบล็อก ip ต่อไปนี้ในการออกแบบของคุณ:

    • ตัวควบคุมเวลา
    • AXI4-สตรีมไปยังวิดีโอเอาท์
    • RGB เป็น DVI
    • AXI VDMA
    • AXI GPIO
    • ระบบประมวลผล
    • ตัวช่วยสร้างนาฬิกา
    • ค่าคงที่ (VDD ตั้งค่าเป็น 1)
  2. ทำตามรูปแบบเดียวกันสำหรับการกำหนดค่าบล็อกเหล่านี้เป็นเครื่องส่งสัญญาณ รูปภาพสำหรับความแตกต่างที่โดดเด่นในการกำหนดค่าได้รวมไว้ที่นี่ ส่วนอื่นๆ ยังคงเหมือนเดิมกับเครื่องส่งสัญญาณ
  3. กำหนดค่า VDMA สำหรับการออกแบบนี้เป็นช่องอ่านอย่างเดียว ปิดการใช้งานช่องเขียน
  4. ตัวช่วยสร้างนาฬิกาควรได้รับการกำหนดค่าสำหรับผลลัพธ์ต่อไปนี้:

    • clk_out1: 75 MHz (นาฬิกาพิกเซล)
    • clk_out2: 150 MHz (นาฬิกาสตรีม)
    • clk_out3: 50 MHz (นาฬิกา axi-lite)
  5. เชื่อมต่อบล็อกวิดีโอตามที่แสดงในภาพการออกแบบบล็อก RX
  6. จากนั้นเรียกใช้การเชื่อมต่ออัตโนมัติ ซึ่งจะเพิ่มบล็อก AXI Interconnect, AXI SmartConnect และ System Reset และพยายามทำการเชื่อมต่อที่เหมาะสม ไปที่นี่อย่างช้าๆ เพื่อให้แน่ใจว่าจะไม่ทำการเชื่อมต่อที่ไม่ต้องการ
  7. สร้างนาฬิกา HDMI TMDS และหมุดข้อมูลภายนอกบนบล็อก rgb2dvi
  8. การออกแบบนี้ไม่จำเป็นต้องใช้สัญญาณปลั๊กร้อน

ขั้นตอนที่ 3: ตั้งค่าไดรเวอร์ VDMA

ตั้งค่าไดรเวอร์ VDMA
ตั้งค่าไดรเวอร์ VDMA

การตั้งค่าสำหรับบล็อกต่างๆ ที่กำหนดค่าผ่านอินเทอร์เฟซ AXI-Lite ทำได้ดีที่สุดโดยใช้โปรเจ็กต์สาธิตที่รวมอยู่ใน BSP เป็นข้อมูลอ้างอิง หลังจากส่งออกฮาร์ดแวร์การออกแบบและเปิดใช้ SDK จาก Vivado คุณจะต้องเพิ่มแพ็คเกจการสนับสนุนบอร์ดใหม่และรวมไลบรารี lwip202 ในหน้าต่างการตั้งค่า BSP เปิดไฟล์ไฟล์ system.mss จาก BSP แล้วคุณจะเห็นไดรเวอร์อุปกรณ์ต่อพ่วงจากการออกแบบบล็อกของคุณ ตัวเลือก "นำเข้าตัวอย่าง" ให้คุณนำเข้าโปรเจ็กต์สาธิตที่ใช้อุปกรณ์ต่อพ่วงเหล่านี้ และแสดงวิธีกำหนดค่าในซอฟต์แวร์โดยใช้ไดรเวอร์ Xilinx ที่มีให้ (ดูภาพที่แนบมา)

นี่เป็นวิธีที่ใช้สำหรับกำหนดค่า VDMA, Timer & Interrupt และ GPIO ซอร์สโค้ดสำหรับทั้งการส่งและรับถูกรวมไว้ที่นี่ ความแตกต่างเกือบจะเฉพาะใน main.c

***หมายเหตุ: เนื่องจากระบบทำงานได้ไม่สมบูรณ์ในขณะที่เขียนบทช่วยสอนนี้ ซอร์สโค้ดในส่วนนี้จึงไม่รวมรหัสเครือข่ายไร้สาย ข้อบกพร่องหลายอย่างต้องได้รับการแก้ไขอันเป็นผลมาจากการรวมโปรเจ็กต์การส่ง/รับแกนวิดีโอเข้ากับโปรเจ็กต์การส่ง/รับเครือข่าย ดังนั้นบทช่วยสอนนี้จะถือว่าพวกเขาแยกจากกันในขณะนี้***

ฟังก์ชันตัวจัดการการขัดจังหวะ TX (IRQHandler)

ฟังก์ชันนี้อ่านโค้ดสีเทาที่มาจากทั้ง VDMA แบบอ่านและเขียนผ่านบล็อก GPIO รหัสสีเทาจะถูกแปลงเป็นทศนิยมและใช้สำหรับการเลือกตำแหน่งหน่วยความจำฐานเฟรมของเฟรมปัจจุบัน เฟรมที่คัดลอกคือเฟรมก่อนหน้าไปยังเฟรมที่ VDMA เขียนถึง (เช่น หาก VDMA กำลังเขียนไปที่เฟรม 2 เราจะคัดลอกเฟรมที่ 1 หากเขียนไปที่เฟรม 0 เราจะตัดและอ่านจากเฟรมที่ 2)

ฟังก์ชันจะจับภาพทุกเฟรมที่ 6 เท่านั้นเพื่อลดอัตราเฟรมเป็น 10 Hz แทนที่จะเป็น 60 Hz ขอบเขตบนของเครือข่ายคือ 300 Mbps ที่ 10 เฟรมต่อวินาทีต้องใช้แบนด์วิดท์ 221.2 Mbps

การแสดงความคิดเห็น/ยกเลิกการแสดงความคิดเห็นสองบรรทัดในฟังก์ชันนี้จะอนุญาตให้ผู้ใช้เปลี่ยนเป็นโหมด HDMI passthru เพื่อจุดประสงค์ในการดีบัก/ทดสอบ (มีการแสดงความคิดเห็นโค้ดเพื่อระบุบรรทัดที่เหมาะสม) ปัจจุบันคัดลอกเฟรมไปยังตำแหน่งหน่วยความจำที่ใช้โดยรหัสอีเธอร์เน็ต

ฟังก์ชันตัวจัดการการขัดจังหวะ RX (IRQHandler)

ฟังก์ชันนี้คล้ายกับฟังก์ชัน TX มาก แต่จะคัดลอกจาก 2 บัฟเฟอร์ FIFO ที่ใช้โดยอีเธอร์เน็ตเพื่อเขียนข้อมูลขาเข้า รหัสอีเธอร์เน็ตระบุว่าเฟรมใดกำลังเขียนไปยัง FIFO ข้อมูลจะถูกคัดลอกจากเฟรมตรงข้าม ข้อมูลจะถูกคัดลอกไปยังเฟรมที่อยู่ด้านหลังข้อมูลที่ VDMA อ่านเพื่อหลีกเลี่ยงการฉีกขาด

ขั้นตอนที่ 4: ตั้งค่าเครือข่าย Nanorouter

ตั้งค่าเครือข่าย Nanorouter
ตั้งค่าเครือข่าย Nanorouter

ในการสร้างเครือข่ายโดยใช้ TPlink nanorouters ให้เปิดเครื่องทีละตัวและเชื่อมต่อกับ wifi SSID เริ่มต้นสำหรับอุปกรณ์ ข้อมูลเพิ่มเติมเกี่ยวกับการตั้งค่าการกำหนดค่าสำหรับอุปกรณ์นี้สามารถดูได้จากคู่มือผู้ใช้อุปกรณ์

ตั้งค่าหนึ่งในอุปกรณ์เป็นจุดเข้าใช้งาน ซึ่งจะทำหน้าที่เป็นการเชื่อมต่อหลักสำหรับเครือข่าย ตรวจสอบให้แน่ใจว่าได้ตั้งชื่อเครือข่ายและจดชื่อไว้ และปิดการใช้งาน DHCP (เราไม่ต้องการให้เราเตอร์กำหนดค่าที่อยู่ IP แบบไดนามิก เราต้องการให้บอร์ด tansmitter และผู้รับ Zybo ตั้งค่าที่อยู่ IP ของตนเองเพื่อให้สอดคล้องกัน) หลังจากกำหนดค่าแล้ว ตรวจสอบให้แน่ใจว่าอุปกรณ์รีบูตและสร้างเครือข่ายนี้

ตั้งค่าอุปกรณ์อื่นเป็นไคลเอนต์ และตรวจสอบให้แน่ใจว่าอุปกรณ์เชื่อมต่อกับเครือข่าย SSID ที่คุณตั้งค่าด้วยนาโนเราเตอร์ตัวแรก อีกครั้ง ตรวจสอบให้แน่ใจว่า DHCP ถูกปิดใช้งานสำหรับไคลเอ็นต์

เมื่อไคลเอนต์เสร็จสิ้นและรีบูต เครื่องควรเชื่อมต่อกับจุดเข้าใช้งาน nanorouter (หากไม่เป็นเช่นนั้น อาจมีปัญหาในการกำหนดค่าอุปกรณ์เครื่องใดเครื่องหนึ่งของคุณ) คุณจะสังเกตเห็นว่าไฟ LED บนไคลเอนต์จะสว่างเมื่อเชื่อมต่อกับจุดเข้าใช้งาน

ไฟ LED ของจุดเข้าใช้งาน nanorouter มีแนวโน้มที่จะกะพริบต่อ ณ จุดนี้ ไม่เป็นไร! ไฟกะพริบหมายความว่าไม่ได้เชื่อมต่อกับอุปกรณ์อื่นจากพอร์ตอีเธอร์เน็ต และเมื่อเชื่อมต่อกับ Zybo ที่กำหนดค่าแล้ว ไฟ LED จะสว่างนิ่งเพื่อระบุว่าการเชื่อมต่อเครือข่ายสำเร็จ

ตอนนี้เรามีการตั้งค่านาโนเราเตอร์แล้ว เรามีเครือข่ายไร้สายที่จะช่วยให้เราสื่อสารผ่านได้ หมายเหตุสำคัญคือวิธีการกำหนดค่าของเราสำหรับ nanorouters (เป็นจุดเชื่อมต่อและไคลเอนต์) ช่วยให้เราสามารถสื่อสารจากบอร์ด Zybo ที่ส่งสัญญาณไปยังบอร์ด Zybo ที่รับได้ราวกับว่าทั้งสองเชื่อมต่อด้วยสายอีเธอร์เน็ตเส้นเดียว สิ่งนี้ทำให้การตั้งค่าเครือข่ายของเรายากขึ้น เนื่องจากทางเลือกอื่นอาจรวมการกำหนดค่าบอร์ด Zybo เพื่อเชื่อมต่อกับเซิร์ฟเวอร์อย่างชัดเจนพร้อมกับการเชื่อมต่อที่ต้องการ

เมื่อตั้งค่าอุปกรณ์ทั้งสองแล้ว เราเตอร์นาโนจะได้รับการกำหนดค่าและพร้อมที่จะนำไปใช้กับเครือข่าย WIDI ของคุณ ไม่มีการจับคู่เฉพาะระหว่าง nanorouters และบอร์ด Zybo เนื่องจากจุดเชื่อมต่อหรือไคลเอนต์จะทำงานสำหรับอุปกรณ์ส่งหรือรับ

ขั้นตอนที่ 5: ตั้งค่าระบบประมวลผล Zynq สำหรับการส่งข้อมูลผ่านอีเธอร์เน็ต

ตั้งค่าระบบประมวลผล Zynq สำหรับการส่งข้อมูลผ่านอีเธอร์เน็ต
ตั้งค่าระบบประมวลผล Zynq สำหรับการส่งข้อมูลผ่านอีเธอร์เน็ต
ตั้งค่าระบบประมวลผล Zynq สำหรับการส่งข้อมูลผ่านอีเธอร์เน็ต
ตั้งค่าระบบประมวลผล Zynq สำหรับการส่งข้อมูลผ่านอีเธอร์เน็ต

ในการส่งข้อมูล HDMI จากบอร์ด Zybo หนึ่งไปยังอีกบอร์ดหนึ่ง เราต้องรวมโปรโตคอลอีเทอร์เน็ตเข้ากับไดรเวอร์ VDMA ของเรา เป้าหมายของเราคือสตรีมเฟรมวิดีโอแต่ละเฟรมผ่านอุปกรณ์ต่อพ่วงอีเทอร์เน็ตในระบบประมวลผลด้วยอัตราที่กำหนดซึ่งสอดคล้องกับแบนด์วิดท์เครือข่ายของเรา สำหรับโครงการของเรา เราใช้ TCP ที่จัดเตรียมโดย LwIP API แบบเปลือย เนื่องจากสมาชิกโปรเจ็กต์ทั้งสองไม่มีประสบการณ์เกี่ยวกับยูทิลิตีเครือข่าย ทางเลือกนี้จึงถูกสร้างขึ้นโดยไม่ทราบถึงความหมายและข้อจำกัดที่เกี่ยวข้องกับ TCP อย่างเต็มที่ ปัญหาหลักของการใช้งานนี้คือแบนด์วิดท์ที่จำกัด และความจริงที่ว่ามันไม่ได้ออกแบบมาเพื่อวัตถุประสงค์ในการนึ่งข้อมูลปริมาณมาก โซลูชันทางเลือกเพื่อแทนที่ TCP และปรับปรุง tbe ในโครงการนี้จะกล่าวถึงในภายหลัง

คำอธิบายสั้น ๆ ของ TCP ที่มี LwIP: ข้อมูลจะถูกส่งผ่านเครือข่ายในแพ็คเก็ตขนาด tcp_mss (ขนาดเซ็กเมนต์สูงสุดของ TCP) ซึ่งโดยทั่วไปคือ 1460 ไบต์ การเรียก tcp_write จะใช้ข้อมูลบางส่วนที่อ้างอิงโดยพอยน์เตอร์ และกำหนดค่า pbufs (แพ็กเก็ตบัฟเฟอร์) เพื่อเก็บข้อมูลและจัดเตรียมโครงสร้างสำหรับการดำเนินการ TCP จำนวนข้อมูลสูงสุดที่สามารถจัดคิวได้ในครั้งเดียวถูกกำหนดเป็น tcp_snd_buf (พื้นที่บัฟเฟอร์ผู้ส่ง TCP) เนื่องจากพารามิเตอร์นี้เป็นตัวเลข 16 บิต เราจึงจำกัดขนาดบัฟเฟอร์การส่งที่ 59695 ไบต์ (จำเป็นต้องมีการเติมบางส่วนในบัฟเฟอร์การส่ง) เมื่อจัดคิวข้อมูลแล้ว tcp_output จะถูกเรียกเพื่อเริ่มส่งข้อมูล ก่อนที่จะส่งข้อมูลส่วนถัดไป จำเป็นต้องส่งแพ็กเก็ตก่อนหน้าทั้งหมดให้สำเร็จ กระบวนการนี้ดำเนินการโดยใช้ฟังก์ชัน recv_callback เนื่องจากเป็นฟังก์ชันที่เรียกใช้เมื่อเห็นการตอบรับจากผู้รับ

การใช้โปรเจ็กต์ตัวอย่างใน Vivado SDK มีประโยชน์มากสำหรับการเรียนรู้วิธีการทำงานของ LwIP TCP และเป็นจุดเริ่มต้นที่ดีสำหรับการเริ่มต้นโปรเจ็กต์ใหม่

ขั้นตอนสำหรับอุปกรณ์ส่งสัญญาณ WiDi มีดังนี้:

  1. เริ่มต้นเครือข่าย TCP โดยใช้การเรียกใช้ฟังก์ชันไดรเวอร์ LWIP แบบเปลือย
  2. ระบุฟังก์ชันการโทรกลับที่จำเป็นสำหรับการทำงานของเครือข่าย
  3. เชื่อมต่อกับเครื่องรับ WiDi โดยเชื่อมต่อกับที่อยู่ IP และพอร์ต (การกำหนดค่าของเรา: IP ตัวรับคือ 192.168.0.9 เชื่อมต่อกับพอร์ต 7)
  4. เมื่อตัวจับเวลาไดรเวอร์ VDMA หมดเวลา ให้ป้อน TX ISR
  5. กำหนดบัฟเฟอร์เฟรมปัจจุบันเพื่อเข้าถึงตามรหัสสีเทา VDMA
  6. จัดคิวข้อมูลส่วนแรกใน TCP send buffer
  7. ส่งออกข้อมูลและอัปเดตตัวแปรในเครื่องเพื่อติดตามจำนวนข้อมูลที่ส่งไปของเฟรมปัจจุบัน
  8. เมื่อไปถึงการเรียกกลับที่ได้รับ (การเรียกใช้ฟังก์ชันหลังจากตัวส่งได้รับการตอบรับการดึงข้อมูล) ให้จัดคิวข้อมูลส่วนถัดไป
  9. ทำซ้ำขั้นตอนที่ 7 และ 8 จนกว่าจะส่งทั้งเฟรม
  10. กลับสู่สถานะว่างเพื่อรอการขัดจังหวะตัวจับเวลาถัดไปเพื่อระบุว่าเฟรมใหม่พร้อมแล้ว (กลับไปที่ขั้นตอนที่ 4)

ตรวจสอบให้แน่ใจว่าได้ตั้งค่าแพ็คเกจรองรับ LwIP ของแพ็คเกจตามที่แสดงในภาพด้านบน ค่าทั้งหมดเป็นค่าเริ่มต้น ยกเว้น tcp_snd_buf, tcp_pueue_ooseq, mem_size, memp_n_tcp_seg นอกจากนี้ โปรดทราบว่าการดีบักโดยละเอียดสามารถทำได้โดยการเปลี่ยนพารามิเตอร์ BSP สำหรับกลุ่ม debug_options

ขั้นตอนที่ 6: ตั้งค่าระบบประมวลผล Zynq สำหรับการรับข้อมูลผ่านอีเธอร์เน็ต

บอร์ดพัฒนา Zybo ที่จะทำหน้าที่เป็นเครื่องรับสัญญาณไร้สายจะทำงานเหมือนกับอุปกรณ์ส่งสัญญาณ การตั้งค่าแพ็คเกจการสนับสนุนบอร์ดสำหรับ LwIP จะเหมือนกับขั้นตอนก่อนหน้า

อุปกรณ์จะรับแพ็กเก็ตที่มีเซ็กเมนต์เฟรมวิดีโอจาก nanorouter และจะคัดลอกข้อมูลเฟรมวิดีโอไปยังพื้นที่บัฟเฟอร์เฟรมสามเฟรมสำหรับ VDMA ที่รับ เพื่อหลีกเลี่ยงการเขียนทับข้อมูลใดๆ จะใช้บัฟเฟอร์ข้อมูลสองเท่า (เราจะเรียกว่าบัฟเฟอร์เครือข่าย) เมื่อรวบรวมข้อมูลจากเราเตอร์นาโน เพื่อให้การรับส่งข้อมูลเครือข่ายสามารถสตรีมต่อไปได้ในขณะที่เฟรมวิดีโอแบบเต็มก่อนหน้ากำลังถูกคัดลอกไปยัง บัฟเฟอร์ VDMA

ขั้นตอนสำหรับอุปกรณ์รับ WiDi ต้องใช้สองงาน งานหนึ่งกำลังรับข้อมูลอีเธอร์เน็ต และอีกงานหนึ่งกำลังคัดลอกเฟรมวิดีโอจากบัฟเฟอร์เครือข่ายไปยังบัฟเฟอร์สามเฟรมของ VDMA

งานรับอีเธอร์เน็ต:

  1. เริ่มต้นเครือข่าย TCP โดยใช้การเรียกใช้ฟังก์ชันไดรเวอร์ LWIP แบบเปลือย (ตั้งค่าด้วยที่อยู่ IP ที่เครื่องส่งจะเชื่อมต่อ 192.168.0.9 ในของเรา)
  2. ระบุฟังก์ชันการโทรกลับที่จำเป็นสำหรับการทำงานของเครือข่าย
  3. เมื่อได้รับแพ็กเก็ตอีเทอร์เน็ต ให้คัดลอกข้อมูลแพ็กเก็ตลงในบัฟเฟอร์เครือข่ายปัจจุบัน เพิ่มข้อมูลที่สะสมในปัจจุบัน
  4. หากแพ็กเก็ตเติมบัฟเฟอร์เฟรมเครือข่าย ให้ดำเนินการต่อในขั้นตอนที่ 5 & 6 มิฉะนั้น ให้วนกลับไปที่ขั้นตอนที่ 3 จากงานนี้
  5. ส่งสัญญาณว่างานบัฟเฟอร์เฟรมสาม VDMA ควรคัดลอกจากบัฟเฟอร์เครือข่ายที่เพิ่งสร้างเสร็จใหม่
  6. เปลี่ยนไปใช้บัฟเฟอร์เครือข่ายอื่นและรวบรวมข้อมูลต่อไปผ่านอีเทอร์เน็ต
  7. ว่างจนกว่าจะได้รับแพ็กเก็ตอีเทอร์เน็ตใหม่ (ขั้นตอนที่ 3)

คัดลอกบัฟเฟอร์เครือข่ายไปยัง VDMA triple frame buffer:

  1. เมื่อตัวจับเวลาไดรเวอร์ VDMA หมดเวลา ให้ป้อน RX ISR
  2. กำหนดเฟรมบัฟเฟอร์ปัจจุบันเพื่อเข้าถึงตามรหัสสีเทา VDMA
  3. กำหนดว่าจะคัดลอกบัฟเฟอร์เครือข่ายใดไปยังบัฟเฟอร์ VDMA และคัดลอกข้อมูลนั้น

ขั้นตอนที่ 7: เชื่อมต่อบอร์ด Zybo ของคุณกับแหล่งสัญญาณ HDMI และ HDMI Sink

เชื่อมต่อบอร์ด Zybo ของคุณกับแหล่งสัญญาณ HDMI และ HDMI Sink
เชื่อมต่อบอร์ด Zybo ของคุณกับแหล่งสัญญาณ HDMI และ HDMI Sink

ตอนนี้เชื่อมต่อสาย hdmi สำหรับทั้งเครื่องรับและเครื่องส่งสัญญาณ ตั้งโปรแกรม FPGA และเรียกใช้ระบบการประมวลผล อัตราเฟรมน่าจะช้ามาก เนื่องจากมีค่าใช้จ่ายมหาศาลในการดำเนินการ LwIP และแบนด์วิดท์ที่จำกัด หากมีปัญหาใดๆ ให้เชื่อมต่อผ่าน UART และพยายามระบุคำเตือนหรือข้อผิดพลาด

ขั้นตอนที่ 8: แนวคิดทางเลือกเพื่อการปรับปรุง

แนวคิดทางเลือกเพื่อการปรับปรุง
แนวคิดทางเลือกเพื่อการปรับปรุง

ปัญหาใหญ่สำหรับโปรเจ็กต์นี้คือปริมาณข้อมูลที่จำเป็นในการส่งผ่าน wifi เป็นไปตามคาด อย่างไรก็ตาม เราประเมินผลกระทบที่จะเกิดขึ้นต่ำเกินไป และส่งผลให้ภาพจำนวนมากขึ้นบนหน้าจอแทนที่จะเป็นฟีดวิดีโอ มีหลายวิธีในการปรับปรุงโครงการนี้:

  • การบีบอัดวิดีโอตามเวลาจริง การบีบอัดเฟรมฟีดวิดีโอขาเข้าทีละเฟรมจะช่วยลดปริมาณข้อมูลที่จำเป็นในการส่งผ่านเครือข่ายได้อย่างมาก ตามหลักการแล้วสิ่งนี้ควรทำในฮาร์ดแวร์ (ซึ่งไม่ใช่งานง่าย) หรือสามารถทำได้ในซอฟต์แวร์โดยใช้แกน ARM อื่นเพื่อเรียกใช้อัลกอริธึมการบีบอัด (ซึ่งจะต้องมีการวิเคราะห์เพิ่มเติมเพื่อให้แน่ใจว่ากำหนดเวลาทำงาน) มีส่วนประกอบการบีบอัดวิดีโอแบบโอเพนซอร์สแบบเรียลไทม์ที่เราพบบนเว็บ แต่ส่วนใหญ่เป็น IP
  • การใช้กระแสข้อมูลอีเทอร์เน็ตในฮาร์ดแวร์ แทนที่จะเป็นซอฟต์แวร์ มีค่าใช้จ่ายจำนวนมากเนื่องจากไม่มีพื้นที่ว่างในการจัดคิวข้อมูลขาออกในตัวส่งสัญญาณ เนื่องจากข้อจำกัดของขนาดเซ็กเมนต์ กระบวนการที่มีประสิทธิภาพมากขึ้นคือการใช้ AXI Ethernet IP กับบัฟเฟอร์ FIFO หรือ DMA เพื่อป้อนข้อมูลเข้าไป สิ่งนี้จะลดสัมภาระเพิ่มเติมจาก LwIP TCP และช่วยให้สามารถรับส่งข้อมูลได้มากขึ้น

ขั้นตอนที่ 9: การช่วยสำหรับการเข้าถึง

ผลิตภัณฑ์ที่เป็นผลลัพธ์ของโปรเจ็กต์ WiDi นี้ควรเป็นอุปกรณ์คู่ขนาดกะทัดรัดที่ผสานรวมอย่างสมบูรณ์ซึ่งผู้ใช้สามารถเชื่อมต่อกับแหล่งสัญญาณ HDMI ใดก็ได้ จากนั้นส่งฟีดวิดีโอไปยังจอแสดงผลที่มีความสามารถ HDMI แบบไร้สาย อุปกรณ์ดังกล่าวจะมี Zynq-7000 SoC ที่พบในบอร์ดอ้างอิงของ Zybo และรวมฮาร์ดแวร์เครือข่ายที่พบในเราเตอร์นาโน TP-Link ตามหลักการแล้ว ผู้ใช้จะสามารถควบคุมโมดูลการส่งสัญญาณจากตำแหน่งที่ไม่ต่อเนื่องภายในระบบปฏิบัติการเป้าหมาย โดยไม่จำเป็นต้องใช้ความสามารถทางเทคนิคที่มีนัยสำคัญ

ความปลอดภัยและการเชื่อมต่อ

อุปกรณ์ควรรวม Transport Layer Security (TLS) และมีความสามารถในการเชื่อมต่ออัตโนมัติที่จำกัด ทั้งเพื่อวัตถุประสงค์ด้านความเป็นส่วนตัว เป็นความตั้งใจของนักออกแบบที่จะทำให้การเชื่อมต่อกับจอแสดงผลผ่านอินเทอร์เฟซไร้สายเป็นการกระทำโดยเจตนาในนามของผู้ใช้เพื่อหลีกเลี่ยงการเผยแพร่เนื้อหาที่มีความละเอียดอ่อนโดยไม่ได้ตั้งใจ

สถานะปัจจุบัน

จนถึงตอนนี้ สถานะของโครงการยังคงเป็นงานที่คืบหน้ามาก เพื่อให้ผู้ใช้ปลายทางปัจจุบันได้รับประโยชน์จากบทช่วยสอนนี้ เขาหรือเธอต้องมีความเข้าใจด้านเทคนิคอย่างแน่นหนาเกี่ยวกับการออกแบบระบบฝังตัว และควรมีความคุ้นเคยกับฮาร์ดแวร์ที่ตั้งโปรแกรมได้และซอฟต์แวร์ฝังตัวที่ทำงานร่วมกัน

ข้อมูลที่ส่งผ่านเครือข่ายไม่ได้เข้ารหัส ณ จุดนี้ และจะถือว่าเป็นการส่งแบบดิบของแพ็กเก็ต TCP/IP

โปรเจ็กต์หลักวิดีโอได้รับการทดสอบเรียบร้อยแล้วสำหรับทั้งการส่งและรับ ในทางกลับกัน การเชื่อมต่อไร้สายระหว่างบอร์ด zybo สองบอร์ดถูกสร้างขึ้นและส่งข้อมูลเฟรมการทดสอบเรียบร้อยแล้ว อย่างไรก็ตาม ยังคงจำเป็นต้องรวมรหัสเครือข่ายกับแต่ละโปรเจ็กต์หลักของวิดีโอและทดสอบการส่งเฟรมวิดีโอจริง

แนะนำ: