วันอังคารที่ 9 กรกฎาคม พ.ศ. 2556

โปรเจค PCI card ตอนที่ 5 PCI driver for windows

โปรเจค PCI card ตอนที่ 5 PCI driver for windows


วิธีการดีบัก PCI card ในระบบ windows นั้นมีโปรแกรม windriver (http://www.jungo.com) ผมใช้ตัวทดลอง เมื่อเปิดโปรแกรมขึ้นมาจะสามารถเลือก card ที่เราต้องการ acess ได้ รูปด้านล่างเป็นรูปตอนทดสอบผ่าน windriver


เมื่อเราทดสอบผ่าน windriver ว่า PCI card ที่ทำขึ้นมานั้นสามารถทำงานได้แล้ว จากนั้นก็ต้องมาทำ driver บน windows ซึ่งสามารถทำได้โดยการใช้ WDK (Windows Driver Kit) รูปด้านล่างเป็นผลจากการรัน WDK 


เมื่อสร้าง driver ได้แล้วถ้าลองลงดูจะพบว่า เราจะเห็น device ของเราผานทาง device manager ของ windows ครับ




โปรเจค PCI card ตอนที่ 4 PCI driver for linux

โปรเจค PCI card ตอนที่ 4 PCI driver for linux


การจะเขียน driver ต้องเข้าใจภาพรวมก่อน ภาพรวมระบบจะเป็นดังภาพด้านล่าง นั้นคือ PC จะสั่งงาน ADC , DAC, DIO ไปที่ FPGA (ผ่านทาง PCI bus) จากนั้น FPGA จะเอาค่าต่างๆ ที่ ได้รับมา ไปสั่งงาน ADC, DAC, DIO อีกทีนึง



การจะให้ PC คุยกับ PCI card ให้รู้เรื่องนั้น มีสิ่งสำคัญแค่ 2 อย่างเท่านั้นคือ
1. Vendor ID, Device ID
ตัวนี้จะเป็นตัวบอกว่า จะให้ PC ไปติดต่อสื่อสารกับ Card ตัวไหน
2. Memory map
memory map นั้นเรา(ผู้สร้างระบบ)จะเป็นคนกำหนดขึ้นมาเอง จะเป็นข้อกำหนดว่า ถ้าจะสั่งงานอะไร ต้องส่ง data ไปที่ address ไหน รูปด้านล่างเป็น memory map ของ card ตัวนี้ที่ผมกำหนดขึ้นมา



เมื่อเราสร้าง driver ได้แล้ว พอ Insmod เราจะเจอ driver ของเราดังรูปด้านล่าง


เมื่อเราสร้าง driver ขึ้นมาได้ ถ้าเรา access ตาม memory map ที่เราสร้างขึ้นก็จะสามารถ ควบคุม ADC, DAC, DIO ได้ตามที่เราต้องการแล้ว รูปด้านล่างเป้น test program ที่ทำขึ้นมาจาก QT ครับ



โปรเจค PCI card ตอนที่ 3 ออกแบบ FPGA

โปรเจค PCI card ตอนที่ 3 ออกแบบ FPGA


ในตอนนี้ผมจะขอพูดแค่การออกแบบ FPGA สำหรับทำให้เป็น PCI card เท่านั้นนะครับ ส่วนการออกแบบให้ลง NIOS2(Soft core CPU) นั้นจะพูดอีกทีในตอนต่อๆไป

1. PCI interface
วิธีการ
  1. ช้ IP core ที่ Altera มีมาให้
  2. เขียน PCI interface ด้วย VHDL หรือ Verilog ด้วยตัวเอง 
ผมเลือกแบบที่ 2 ครับ ที่เลือกแบบที่ 2 นั้นก็เพราะท้ายสุดจะเอาบอร์ดนี้ให้ คนทั่วไปหรือนักศึกษาเอาไปเรียนรู้ ถ้าคนเอาไปแล้วยังต้องไป crack หรือต้อซึ่ง IP core มันจะทำให้ลำบากเกินไป
แต่ที่บอกว่า เขียน PCI interface ด้วย VHDL code เองนั้น ผมก็ไม่ได้เขียนเองหรือเผอิญ(อีกแล้ว)เจอหนังสือเล่มนึงสอนเขียน VHDL code แล้วเค้าก็มีตัวอย่าง code มาให้ด้วยมาลิงค์นี้เลยครับ http://www.cqpub.co.jp/hanbai/books/33/33361.htm อาจจะลำบากหน่อยเพราะเป็นภาษาญี่ปุ่น แต่ไม่เป็นไร เอาเราแค่โค้ดส่วนที่เป็น PCI interface มาใช้

2. Peripheral interface

1. DAC
MCP4922
เขียนทีเดียว 4 channel

2. ADC
MCP3208
อ่านทีเดียว 8 channel

3. DIO
อันนี้เป็นแค่ ออก output High/Low อย่างเดียว


 3. Simulation

สำคัญที่สุดคือ การ simulation ครับ โค้ด PCI interface ที่เราเอามาจะรู้ได้ยังไงว่าใช้ได้จริง ก็ต้องมาลอง simulate ดูครับ รูปข้างล่างเป็นรูปผล simulate รูปนี้เป็นการ sim ให้ สั่งงาน ADC ผ่าน PCI bus ครับ สังเกตุว่าเมื่อมีสัญญาณจาก PCI (ad, cben . ... etc ) จะมีสัญญาณออกทาง ADC (ADC_DIN, ADC_CLK ,... etc)



ส่วนรูปนี้ขยายจากรูปข้างบนอีกทีครับ


4. Memory map

จากข้อ 3 เราสามารถสื่อสารกันผ่านทาง PCI bus ได้แล้ว มาถึงการออกแบบจริง จำเป็นต้องมีสิ่งที่เรียกว่า memory map เพราะจะเป็นตัวบอกว่า เราจะสั่งงานอะไรต้อง data ไปที่ address  ไหน ข้างล่างเป็น memory map ที่ผมได้กำหนดขึ้นมาคร่าวๆ ไว้ครับ