เมื่อสัปดาห์ที่แล้วเราได้แนะนำเครื่องมืออินเตอร์เฟส Serial Bus Pirate Universal รุ่นใหม่ การอัพเดตเฟิร์มแวร์ครั้งสุดท้ายรวมถึงไลบรารีตัวถอดรหัสคีย์บอร์ดสำหรับทั้งเวอร์ชันฮาร์ดแวร์
มีคีย์บอร์ดที่คีย์บอร์ดมีอายุมากกว่าหนึ่งตันในการฝังกลบ เราจะแสดงวิธีการรีไซเคิลหนึ่งเป็นอุปกรณ์อินพุตสำหรับโครงการต่อไปของคุณ
การเชื่อมต่อ
โจรสลัดรถบัส
พีซีที่คีย์บอร์ด (PIN #)
SDA
ข้อมูล KBD (3)
สกูล
นาฬิกา KBD (1)
+ 5volts
VDD (5)
gnd
gnd (2)
ที่คีย์บอร์ดสื่อสารผ่านอินเตอร์เฟสสองทิศทางแบบสองทิศทาง รถบัสเปิดตัวสะสม แต่คีย์บอร์ดมีตัวต้านทานแบบดึงภายในอยู่แล้ว พีซีที่โปรโตคอลแป้นพิมพ์อธิบายไว้ที่นี่ เราใช้เครื่องมือ Bus Pirate ของเราเพื่อสาธิตโปรโตคอลแป้นพิมพ์ แต่หลักการพื้นฐานเดียวกันนี้ใช้กับไมโครคอนโทรลเลอร์ใด ๆ
เราเชื่อมต่อกับโจรสลัดรถบัสกับแป้นพิมพ์ตามที่อธิบายไว้ในตาราง เราเชื่อว่านี่เป็นผู้หญิงที่ผ่านรูที่แจ็คแป้นพิมพ์ แต่เรายังไม่ได้ประเมินมัน คุณรู้แหล่งที่มาสำหรับซ็อกเก็ตใหม่หรือไม่?
มาตรการ
แป้นพิมพ์มีสัญญาณนาฬิกาสำหรับการถ่ายโอนข้อมูลทั้งหมด ด้านพีซีมีลักษณะคล้ายกับอุปกรณ์ทาส ไม่มีห้องสมุดอินเทอร์เฟซบัสของรถบัสที่มีอยู่กับนาฬิกาภายนอกดังนั้นเราจึงเขียนไลบรารีตัวถอดรหัสคีย์บอร์ดที่ง่าย ห้องสมุดขึ้นอยู่กับสัญญาณนาฬิกาของคีย์บอร์ดและมันจะแขวนหากแป้นพิมพ์ล้มเหลวหรือไม่ได้เชื่อมต่อ หากคุณใช้ห้องสมุดของเราในโครงการของคุณเองให้ลองเพิ่มความล่าช้าการหมดเวลาในฟังก์ชั่น Readbit () และ Wrebit ()
รหัส PC ไปยังแป้นพิมพ์
รหัส
สั่งการ
0xed
ตั้งไฟ LED สถานะ
0xee
echo 0xee
0xf0
ตั้งประเภท SCANCODE
0xf3
ตั้งค่าอัตราการทำซ้ำ
0xf4
แป้นพิมพ์เปิดใช้งาน
0xf5
แป้นพิมพ์ปิดการใช้งาน
0xfe
ส่งไบต์สุดท้ายอีกครั้ง
0xff
รีเซ็ตแป้นพิมพ์
พีซีใช้คำสั่งเหล่านี้เพื่อควบคุมฟังก์ชั่นต่าง ๆ ของคีย์บอร์ดที่คีย์บอร์ด แป้นพิมพ์ตอบสนองต่อคำสั่งด้วย Acknowledge Byte (OXFA) ในประสบการณ์ของเราแป้นพิมพ์จะรีเซ็ตหากไม่ได้อ่านไบต์ในไม่ช้าหลังจากส่งคำสั่ง
แป้นพิมพ์ไปยังรหัสปฏิกิริยา PC
รหัส
การตอบสนอง
0xfa
รับทราบ
0xaa
ผ่านการทดสอบด้วยตนเอง
0xee
การตอบสนอง echo
0xfe
ส่งไบต์สุดท้ายอีกครั้ง
0x00 หรือ 0xff
ข้อผิดพลาดหรือบัฟเฟอร์ล้น
แป้นพิมพ์มีรหัสปฏิกิริยาไบต์เดียวจำนวนหนึ่ง คำสั่งพีซีจำนวนมากได้รับการยอมรับด้วย 0xFA 0xAA ถูกส่งหลังจากแป้นพิมพ์รีเซ็ต
ตั้งค่าโจรสลัดรถบัส
hiz> m
1. HIZ
…
9. พีซีที่คีย์บอร์ด
โหมด> 9 <-Set Mode
ชุดโหมด 900
x02 PC ที่ KB Decoder พร้อม
พีซีที่คีย์บอร์ด>
ครั้งแรกเราตั้งค่าโจรสลัดรถบัสสำหรับโหมดแป้นพิมพ์ตัวเลือก 9
พีซีที่แป้นพิมพ์> P <-Power Supply Setup w / w toggles 3.3volt supply? 1. ไม่ 2. ใช่ โหมด> 1 <-No 3.3Volt Supply w / w togles 5volt supply? 1. ไม่ 2. ใช่ โหมด> 2 <- ใช้อุปทาน 5volt การกำหนดค่าอุปทาน 9xx ใช้ w / w เพื่อสลับ ตรวจสอบแรงดันไฟฟ้า 9xx: 5V: 0.0 | 3.3V: 0.0 | VPullup: 0.0 | พีซีที่คีย์บอร์ด> W <-Capital 'W' ให้เปิดใช้งาน อุปทาน 9xx 5volt บน พีซีที่คีย์บอร์ด>
ถัดไปเรากำหนดค่าแหล่งจ่ายไฟของบัสโจรสลัดเพื่อเสนอ 5volts สำหรับแป้นพิมพ์ที่คีย์บอร์ด
พีซีที่คีย์บอร์ด> R <-Read Byte จากแป้นพิมพ์ X30 PCATKB อ่าน: ไม่มี <-NO ข้อมูลที่มีอยู่ พีซีที่คีย์บอร์ด>
The At Keyboard Library เป็นไปตามไวยากรณ์โจรสลัดบัสมาตรฐาน ค่าตัวเลขจะถูกส่งไปยังคีย์บอร์ดเป็นไบต์ ‘R’ อ่านไบต์จากแป้นพิมพ์ โปรโตคอลถูกโอเวอร์คล็อกโดยคีย์บอร์ดการดำเนินการบิตทายคู่ถูกปิดใช้งาน หากไม่มีข้อมูลการอ่านจะกลับมา ‘ไม่มี’
ตั้งค่าแป้นพิมพ์
พีซีที่คีย์บอร์ด> 0XEE r <-SEND 0XEE อ่านหนึ่งไบต์ X20 PCATKB เขียน: 0XEE Got ACK <- เขียนออกดีได้รับ ACK บิต X30 PCATKB อ่าน: 0XEE <-Read 0xee, Echo ประสบความสำเร็จ พีซีที่คีย์บอร์ด>
เราสามารถทดสอบการเชื่อมต่อกับแป้นพิมพ์ที่คีย์บอร์ดโดยใช้คำสั่ง echo, 0xee แป้นพิมพ์จะตอบกลับ 0xee หากการเชื่อมต่อของเราถูกต้อง
แป้นพิมพ์ตอบสนองต่อคำสั่งด้วย ACK บิตที่ระดับโปรโตคอลแล้วอีกครั้งด้วย ACK ไบต์ เราพบว่าคีย์บอร์ดทดสอบของเรารีเซ็ตโดยอัตโนมัติหากไม่ได้อ่าน ACK Byte ทันทีหลังจากส่งคำสั่ง
พีซีที่คีย์บอร์ด> 0XEE <-echo คำสั่ง X20 PCATKB เขียน: 0xee ได้รับ ACK <-WROTE ECHO, Got ACK พีซีที่คีย์บอร์ด> R <- อ่านหนึ่งไบต์ x30 pcatkb อ่าน: 0xaa <-read 0xaa, รีเซ็ตตัวบ่งชี้ พีซีที่คีย์บอร์ด>
ที่นี่เราพยายามส่งคำสั่ง echo แล้วอ่านคำตอบในภายหลัง แป้นพิมพ์รีเซ็ตโดยอัตโนมัติและตอบกลับ 0xaa การทดสอบตัวเองผ่านไป
พีซีที่คีย์บอร์ด> คำสั่ง 0xff r <-reset อ่านสองไบต์ X20 PCATKB เขียน: 0XFF มี ACK <- เขียนคำสั่งรีเซ็ตได้รับ ACK X30 PCATKB อ่าน: 0xFA <-command ackbyby X30 PCATKB อ่าน: ไม่มี <- อ่านอีกครั้งเพื่อรีเซ็ต พีซีที่คีย์บอร์ด>
แป้นพิมพ์ถูกรีเซ็ตโดยการเขียนคำสั่ง 0xFF และอ่านสองไบต์ แป้นพิมพ์จะไม่รีเซ็ตจนกว่าจะอ่านไบต์ที่สอง
พีซีที่คีย์บอร์ด> R <- อ่านไบต์ X30 PCATKB อ่าน: 0xaa <-Reset Success พีซีที่คีย์บอร์ด>
ช่วงเวลาสั้น ๆ หลังจากรีเซ็ตเราสามารถอ่านพลังในการทดสอบตัวเอง (โพสต์) ผลลัพธ์ 0xAA หมายถึงการโพสต์ความสำเร็จ
พีซีที่คีย์บอร์ด> 0xF5 R <-Disable the Keyboard X20 PCATKB เขียน: 0xF5 ได้รับ ACK <- เขียนคำสั่ง x30 pcatkb อ่าน: 0xfa <-read ack byte พีซีที่คีย์บอร์ด> 0xF4 R <-Nable Keyboard X20 PCATKB เขียน: 0xf4 ได้รับ ACK <- เขียนคำสั่ง x30 pcatkb อ่าน: 0xfa <-read ack byte พีซีที่คีย์บอร์ด>
0xf5 Disaอินพุตแป้นพิมพ์ Bles 0xF4 เปิดใช้งานแป้นพิมพ์และล้างบัฟเฟอร์
พีซีที่คีย์บอร์ด> 0xED R 0B111 R <-Set ไฟ LED แสดงสถานะ X20 PCATKB เขียน: 0xed มี ACK <-Set LED คำสั่ง x30 pcatkb อ่าน: 0xfa <-command รับทราบ X20 PCATKB เขียน: 0x07 ได้รับ ACK <-Send LED ค่า X30 PCATKB อ่าน: 0xFA <-Value รับทราบ พีซีที่คีย์บอร์ด>
ไฟ LED NUM, CAPS และ SCROLL LOCK ถูกควบคุมโดยคำสั่ง 0xed สามบิตสุดท้ายของไบต์ที่สอง (OB111) ระบุว่าไฟ LED เป็นแสง เป็นสิ่งสำคัญอย่างยิ่งที่จะต้องดำเนินการทั้งสี่ไบต์ภายในระยะเวลาการหมดเวลาของแป้นพิมพ์หรือแป้นพิมพ์จะรีเซ็ต
พีซีที่คีย์บอร์ด> 0xee r <-echo คำสั่งทดสอบ X20 PCATKB เขียน: 0xee ได้รับ ACK x30 pcatkb อ่าน: 0xee PC ที่ Keyboard> 0xFE R <-Repeat คำสั่ง BYTE ล่าสุด X20 PCATKB เขียน: 0xfe มี ACK <- เขียนซ้ำคำสั่งซ้ำ X30 PCATKB อ่าน: 0XEE <-Previous Byte ซ้ำแล้วซ้ำอีก พีซีที่คีย์บอร์ด>
คำสั่งแป้นพิมพ์ที่น่าสนใจล่าสุดคือคำสั่ง Byte ซ้ำ 0xfe ทำให้แป้นพิมพ์ส่งไบต์สุดท้ายอีกครั้ง นี่เป็นคำสั่งที่เป็นประโยชน์หากมีข้อผิดพลาดในการส่งผ่านก่อนหน้า
อ่านกดที่สำคัญ
กดปุ่มจะถูกบัฟเฟอร์โดยคีย์บอร์ดจนกว่าเราจะอ่าน
พีซีที่คีย์บอร์ด> R <-Read Byte X30 PCATKB อ่าน: 0x29 <-Space Scancode พีซีที่คีย์บอร์ด> R <-Read Byte X30 PCATKB อ่าน: 0xf0 <-Key Release Scancode พีซีที่คีย์บอร์ด> R <-Read Byte X30 PCATKB อ่าน: 0x29 <-Space Scancode พีซีที่คีย์บอร์ด>
สื่อมวลชนที่จำเป็นส่ง Scancodes ลำดับแบบหลายไบต์ที่แสดงถึงการกดที่สำคัญ ในตัวอย่างเรากดพื้นที่ที่มี SCANCODE 0x29 เมื่อมีการเปิดตัวที่สำคัญแป้นพิมพ์จะส่ง 0xf0 และสแกนดิสก์สำหรับจำเป็น (0x29) การกดที่สำคัญแต่ละครั้งจะส่งผลให้มีลำดับสามส่วนที่คล้ายกัน
พีซีที่คีย์บอร์ด> R: 4 <- อ่าน 4 ไบต์ X31 PCATKB อ่านเป็นกลุ่ม 0x04 ไบต์: 0x29 0xF0 0x29 ไม่มี <-Space Scancode พีซีที่คีย์บอร์ด>
นี่เป็นเพียงตัวอย่างที่ง่ายที่สุดของตัวอย่างก่อนหน้านี้ แทนที่จะอ่านสามไบต์เป็นรายบุคคลเราใช้คำสั่งอ่านจำนวนมาก อีกครั้งเราได้รับลำดับสคูสติดอวกาศ ความพยายามของเราในการอ่านไบต์ที่ไม่มีอยู่จริงล้มเหลว