FrameBuffer Einker
ได้รับใบอนุญาตภายใต้ GPLV3+ ตั้งอยู่ที่นี่บน GitHub
สิ่งนี้มีจุดประสงค์เพื่อเติมเต็มความรู้สึกของนักพัฒนาและนักพัฒนา Kobo เมื่อพวกเขารู้ว่าพวกเขาไม่มีวิธีการพิมพ์ในหน้าจอของอุปกรณ์!
มันโหดร้ายโดยเฉพาะอย่างยิ่งเมื่อย้ายไปที่ Kobo หลังจากคุ้นเคยกับความแพร่หลายของ eips
บน Kindle ...
ในระยะสั้นมันพิมพ์ข้อความหรือรูปภาพบนหน้าจอของคุณจัดการการซ่อมแซมระดับต่ำด้วยอินเทอร์เฟซ Linux FrameBuffer และ i.MX EPDC (รวมถึง MTK One บน Kindle และ Sunxi One บน Kobo)
มันได้รับการทดสอบเกี่ยวกับ Kobo, Kindle, Bq Cervantes, น่าทึ่งและพกพา แต่พอร์ตไปยังอุปกรณ์อื่น ๆ ของ Linux, i.mx Eink ควรเป็นเรื่องเล็กน้อย #64 พิสูจน์แล้วว่าเราสามารถงอ Sunxi APIs ตามความประสงค์ของเราหากคุณไม่สนใจมากเกินไปเกี่ยวกับการสูญเสียสติในกระบวนการ;)
โดยค่าเริ่มต้นการเรนเดอร์ข้อความขึ้นอยู่กับแบบอักษรบิตแมปเซลล์คงที่มารวมกัน (ดูโพสต์นี้สำหรับการสุ่มตัวอย่างขนาดเล็ก) แต่ต้องขอบคุณการมีส่วนร่วมของ @shermp (#20) คุณสามารถพึ่งพาการเรนเดอร์แบบฟอนต์ truetype/opentype เต็มรูปแบบ!
การสนับสนุนภาพรวมถึงรูปแบบที่พบบ่อยที่สุด (JPEG/PNG/TGA/BMP/GIF/PNM) รวมถึงพิกเซลที่บรรจุในรูปแบบพิกเซลที่เกี่ยวข้องมากที่สุด (GREY8 & RGB32; ทั้ง +/- alpha)
นอกจากนี้ยังทำงานได้ดีอย่างสมบูรณ์แบบบนอุปกรณ์ Linux Framebuffer ทุก ชนิดและรองรับ bitdepths ที่หลากหลาย (4BPP, 8BPP, 16BPP, 24BPP & 32BPP) ดังนั้นคุณสามารถใช้สิ่งนี้เพื่อวาด EFI FB ของคุณ;) .
สำหรับอุปกรณ์ Kobo มีกระทู้สนทนาเปิดอยู่ที่นี่บน Mobileread ซึ่งคุณจะพบไบนารีแบบสแตนด์อโลน มันขาดคำแนะนำโดยละเอียดอย่างมีจุดประสงค์เพราะกลุ่มเป้าหมายส่วนใหญ่เป็นนักพัฒนาและนักจารึก คิดว่านี่เป็นการป้องกันความปลอดภัย;)
นอกจากนี้ยังมีกระทู้น้องสาวสำหรับอุปกรณ์ Kindle ที่นี่ซึ่งนอกเหนือจากไบนารีคุณยังพบตัวอย่างของคนที่ทำสิ่งที่บ้าคลั่งด้วย;)
ในทางปฏิบัติผู้ใช้ Kindle & Kobo ส่วนใหญ่จะได้รับฟรีเนื่องจากรวมกับแพ็คเกจส่วนใหญ่ของฉัน
เป็นตัวอย่างของการใช้งานในป่าดูที่ KFMON ที่ฉันใช้มันเพื่อให้ข้อเสนอแนะด้วยภาพหรือ kobo-rclone ซึ่งยังใช้สำหรับการขูดหน้าจอ นอกจากนี้เรายังใช้มันใน Koreader เพื่อให้กระบวนการอัปเดต OTA เป็นมิตรกับผู้ใช้มากขึ้น
การค้นหา GitHub อย่างรวดเร็วสำหรับรหัสที่กล่าวถึง FBINK ควรให้ผลลัพธ์ที่น่าสนใจเช่น shim การจัดการความเสียหายสำหรับ X11, QT5 QPA หรือ InkVT ซึ่งเป็นเครื่องจำลองเทอร์มินัล
ดูการผูกมัดต่าง ๆ ในภาษาอื่น ๆ ซึ่งมักจะรวมถึงตัวอย่างบางส่วน
ยูทิลิตี้ CLI นั้นมีอยู่ใน API สาธารณะเดียวกันที่สามารถใช้งานผ่านห้องสมุดที่ใช้ร่วมกันหรือคงที่สำหรับโครงการ C หรือผ่าน FFI ในภาษาอื่น ๆ (ระวังแม้ว่าจะได้รับใบอนุญาตภายใต้ GPLV3+ไม่ใช่ LGPL) สำหรับยูทิลิตี้ CLI ดูเอกสารประกอบหรือเรียกใช้ fbink --help
สำหรับรายละเอียด สำหรับห้องสมุดดูส่วนหัวสาธารณะ อย่าลังเลที่จะติดต่อฉันหากสิ่งต่าง ๆ ไม่ชัดเจน!
หมายเหตุ: โดยทั่วไปแล้วมัน ไม่ ได้พยายามจัดการกับการหมุนซอฟต์แวร์เนื่องจากในปัจจุบันดูเหมือนจะเป็นสิ่งที่ถูกต้องกับทั้งรุ่น Kobo FW ปัจจุบันและบน Kindle
YMMV บน FW รุ่นเก่าหรือหากมีสิ่งอื่นเกิดขึ้นกับการหมุน FB หรือหากแอปพลิเคชันของคุณกำลังใช้การหมุนในซอฟต์แวร์ (เช่นวิวพอร์ตที่หมุนได้)
เท่าที่เกี่ยวข้องกับการหมุนของฮาร์ดแวร์มีข้อยกเว้นเฉพาะบางประการสำหรับอุปกรณ์ KOBO:
ผู้ที่ทำงานในโหมด 16BPP และดูเหมือนจะอยู่ในโหมดแนวนอน: เนื่องจากดูเหมือนว่าจะเป็นสถานะดั้งเดิมของพวกเขาเรา จึงพยายาม ชดเชยสิ่งนี้เนื่องจากเราสามารถใช้อย่างถูกกฎหมายก่อนที่นิกเกิลจะแก้ไขสิ่งนี้
บนอุปกรณ์ที่มี accelerometer เช่น Forma & Libra ซึ่งนิกเกิลจะจัดการกับการหมุนของฮาร์ดแวร์
ตัวอย่างพื้นฐานบางประการของการแสดงข้อความเซลล์คงที่ ...
หรือถ้าเราวางภาพไว้ในนั้น ...
และด้วยเสียงระฆังและนกหวีดของการทำงานที่โปร่งใสแม้ในฮาร์ดแวร์โบราณ :)
นี่คือฟอนต์อื่น ๆ สองสามตัวรวมถึงแถบความคืบหน้า ...
และเมื่อใช้แบบอักษร truetype เงางาม :)
เว้นแต่คุณจะแค่พยายามใช้มันเพื่อหมุนในระบบ Pure Linux ดั้งเดิม ( make linux
) คุณจะต้องมีตัวรวบรวมข้ามที่กำหนดเป้าหมายอุปกรณ์เป้าหมายของคุณ
MakeFile ได้รับการปรับแต่งให้ตรวจจับการตั้งค่าเครื่องมือข้ามการรวบรวมของฉันเองโดยอัตโนมัติซึ่งฉันขอแนะนำอย่างเต็มที่จากการใช้แทนการใช้เครื่องมือการรวบรวมข้ามทั่วไปซึ่งอาจไม่กำหนดเป้าหมายเคอร์เนล/LIBC คู่ที่ถูกต้องอย่างแน่นอน)
การใช้ส่วนหน้า Koxtoolchain ควรสร้างหนึ่งในกระบวนการเหล่านี้เป็นกระบวนการที่ไม่เจ็บปวด
ในกรณีที่คุณใช้ Toolchain ของคุณเองโปรดทราบว่าเราต้องการการสนับสนุน C11 (GCC> = 4.9, Clang> = 3.0)
หากคุณไม่ได้ใช้คอมไพเลอร์รุ่นเก่าฉันขอแนะนำให้สร้างสิ่งนี้ด้วยการเปิดใช้งาน LTO!
เมื่อออกนอกเส้นทางเป้าหมายเริ่มต้น (เช่น, make
) จะให้ผลผลิต kobo แบบคงที่ในขณะที่ make kobo
จะให้ผลงานสร้างที่ใช้ร่วมกันที่ถูกถอดออก แพ็คเกจที่พบในเธรด kobo ถูกสร้างขึ้นด้วยวิธีนี้
มีเป้าหมายความสะดวกสบายเล็กน้อยสำหรับประเภทการสร้างปกติ ( make static
สำหรับการสร้างแบบคงที่จัด make shared
make debug
การสร้างที่ใช้ร่วมกัน make strip
สำหรับการสร้างแบบคงที่ที่ถูกถอดออก make release
สำหรับการสร้างที่ใช้ร่วมกัน เป็นกรณีที่ผิดปกติสองสามกรณีสำหรับกรณีการใช้งานที่เฉพาะเจาะจงมากมักเกี่ยวข้องกับการผูก FFI ( make pic
สำหรับการสร้างแบบคงที่ PIC หรือผ่าน STATIC_LIBM=1
เพื่อพยายามเชื่อมโยงกับ libm แบบคงที่)
ตัวเลือกของแพลตฟอร์มเป้าหมายได้รับการจัดการผ่านตัวแปรง่าย ๆ :
KINDLE=1
เพื่อสร้าง Kindle Build ( make kindle
ทำเช่นนั้นในการสร้างแบบคงที่ที่ถอดออก)KINDLE=1 LEGACY=1
เพื่อสร้าง FW 2.x Kindle Build ( make legacy
ทำเช่นนั้นในการสร้างแบบคงที่ที่ถูกถอดออก) โดยทั่วไปแล้วจะปิดใช้งาน CloExec ซึ่งอาจไม่ได้รับการสนับสนุนใน FW 2.XCERVANTES=1
เพื่อสร้าง Bq/Cervantes Build ( make cervantes
ทำเช่นนั้นในการสร้างแบบคงที่ที่ถูกถอดออก)REMARKABLE=1
เพื่อสร้างสิ่งสร้างที่ make remarkable
ทึ่งPOCKETBOOK=1
เพื่อสร้างพ็อกเก็ตบุ๊คบิลด์ ( make pocketbook
ทำเช่นนั้นในการสร้างแบบคงที่ที่ถอดออก)ตรรกะเดียวกันนี้ใช้เพื่อให้สามารถปรับแต่งได้เล็กน้อย:
MINIMAL=1
เพื่อสร้างงานที่มีฟังก์ชั่นที่ จำกัด มาก (ไม่มีการวาดรูปแบบดั้งเดิมไม่มีการแสดงตัวอักษรเซลล์คงที่ไม่มีการเรนเดอร์ภาพไม่มีแบบอักษรพิเศษไม่มี opentype) ซึ่งให้แอปพลิเคชันและห้องสมุดที่เล็กกว่ามากDEBUG=1
เพื่อสร้างการดีบักและผ่าน DEBUG=1 DEBUGFLAGS=1
เพื่อสร้างการดีบักบิลด์ด้วยการดีบัก debug cflags ที่บังคับใช้ นอกจากนี้คุณยังสามารถ ผนวก คุณสมบัติทีละตัวเพื่อสร้าง MINIMAL
:
DRAW=1
เพื่อเพิ่มการสนับสนุนสำหรับการวาดรูปแบบดั้งเดิมBITMAP=1
เพื่อเพิ่มการรองรับสำหรับการแสดงผลแบบอักษรคงที่ (หมายถึง DRAW
)FONTS=1
เพื่อเพิ่มการสนับสนุนสำหรับแบบอักษรคงที่เซลล์คงที่แบบรวม (หมายถึง BITMAP
)IMAGE=1
เพื่อเพิ่มการสนับสนุนภาพ (หมายถึง DRAW
)OPENTYPE=1
เพื่อเพิ่มการสนับสนุนการแสดงผลแบบอักษร OTF/TTF (หมายถึง DRAW
)INPUT=1
เพื่อเพิ่มการสนับสนุนสำหรับยูทิลิตี้อินพุตBUTTON_SCAN=1
เพื่อเพิ่มการสนับสนุนสำหรับการสแกนปุ่ม Kobo-specific (หมายถึง DRAW
) หากคุณ ต้องการ ความครอบคลุมของ Unicode ที่รุนแรง ใน codepath เซลล์คงที่คุณยังสามารถเลือกที่จะฝัง GNU unifont โดยผ่าน UNIFONT=1
ได้รับคำเตือนว่าสิ่งนี้จะเพิ่มเกือบ 2MB ให้กับขนาดไบนารีและตัวอักษรนั้นถูกแบ่งออกเป็นสอง (ร่ายมนตร์กว้างสองเท่าจะถูกปิดลงเป็นแบบอักษรที่เฉพาะเจาะจง) ซึ่งอาจทำให้เกิดประโยชน์ในทางปฏิบัติ ...
ด้วยเหตุผลที่ชัดเจนสิ่งนี้จะ ไม่ เปิดใช้งานโดยค่าเริ่มต้น
หากคุณไม่ได้ทำสิ่งที่เฉพาะเจาะจง มาก โดยทั่วไปคุณต้องการ อย่างน้อย DRAW
& BITMAP
ในการสร้าง MINIMAL
...
อย่าลืมที่จะทำงานอย่างน้อยที่สุด make cleanlib
เมื่อเปลี่ยนแพลตฟอร์มเป้าหมายหรือธงฟีเจอร์มิฉะนั้นการสร้างห้องสมุดการจับคู่ล่าสุดจะถูกเก็บไว้เพราะมันจะเติมเต็มการพึ่งพาของ Make;)
ระหว่างทางเครื่องมือเสริมบางอย่างอาจครอบงำในโฟลเดอร์ utils
make utils
จะสร้างสิ่งเหล่านี้แบบคงที่ (ซึ่งเป็นวิธีที่แนะนำในการทำเช่นนั้นเพราะพวกเขาค่อนข้างจะเป็นลูกหมูบน API ภายใน ของ Fbink) ปัจจุบันสิ่งเหล่านี้ประกอบด้วยเครื่องมือวินิจฉัยเกี่ยวกับพฤติกรรมการหมุนและการทดสอบความเครียดจากการลงโทษที่กล่าวถึงด้านล่าง
สิ่งเหล่านี้ส่วนใหญ่ได้รับการทดสอบใน Kobo เท่านั้น และควรจะถูกทิ้งให้อยู่ตามลำพังเว้นแต่คุณจะรู้ว่าคุณกำลังทำอะไรอยู่;)
เครื่องมือในการจัดการกับ bitdepth บนอุปกรณ์ EINK นั้นมีให้เลือกอย่างถูกต้องและสามารถสร้างขึ้นสำหรับเป้าหมาย e-INK ด้วย make fbdepth
ชื่อที่ไม่ได้รับการสนับสนุนคือ fbdepth
และใช้โดย Koreader บน Kobo & โดดเด่นในการบังคับใช้การหมุนที่มีสติและเปลี่ยนไปใช้ bitdepth ที่มีประสิทธิภาพมากขึ้น นอกจากนี้ยังได้รับการทดสอบใน Kindle ซึ่งการจัดการการหมุนอย่างน้อยที่สุดควรประพฤติตนอย่างถูกต้อง โปรดทราบว่าใน FW 5.x สต็อก GUI ทำงานภายใต้ X และ X จะ ไม่ ชอบคุณหมุน FB จากใต้ฝ่าเท้า;)
หากคุณต้องการไบนารีที่เล็กที่สุดให้แน่ใจว่าคุณสร้างมันขึ้นมาเพียงอย่างเดียวจากต้นไม้ต้นฉบับที่เก่าแก่
นอกจากนี้ยังมีตัวอย่างที่ค่อนข้างโง่ที่แสดง API Dump/Restore ที่สามารถสร้างได้ผ่าน make dump
การสาธิตโง่ ๆ อีกครั้งโดยใช้เอฟเฟกต์ไฟไหม้ PSX Doom ถูกนำมาใช้เพื่อทดสอบความเครียดของ EPDC ในลักษณะที่น่าสนใจเล็กน้อย
หากคุณเคยสงสัยเกี่ยวกับ MXCFB ทั้งหมด Alt_Buffer Shindig คุณสามารถดู POC นี้ได้
ในหลอดเลือดดำเดียวกันหากคุณกำลังมองหาการหมุนเวียนและการป้อนข้อมูล shenanigans บน kobo make devcap
จะสร้าง tarball ที่มีไบนารีสองสามตัวและสคริปต์ devcap_test.sh ซึ่งเมื่อทำงานบนอุปกรณ์เป้าหมาย ข้อมูล. โดยเฉพาะอย่างยิ่งหากคุณจำเป็นต้องรายงานข้อผิดพลาดกับ fbdepth
ฉันอาจขอให้คุณเรียกใช้และแนบผลลัพธ์กับปัญหา;)
และในเรื่องของการป้อนข้อมูลและการหมุนบน Kobo make ftrace
จะสร้างยูทิลิตี้ Pointer Trail อย่างง่ายซึ่งใช้ประโยชน์จาก LibeVdev และการโทร Funkier API ของเราสองสามสายเพื่อพยายามทำความเข้าใจกับการแปลแบบอินพุต
หากคุณตั้งใจจะจัดการอินพุตแบบสัมผัสไม่ว่าในทางใดทางหนึ่งในรหัสของคุณนี่ควรเป็นสถานที่ที่ดีในการดู;)
นอกจากนี้ยังแสดงให้เห็นถึงวิธีการจัดการอย่างมีประสิทธิภาพด้วยการป้อนข้อมูลปากกาและการวาดภาพบน Elipsa
สำหรับ make input_scan
มันจะสร้างเครื่องมือ CLI ขนาดเล็กรอบ ๆ fbink_input_scan
API ซึ่งช่วยให้รู้สึกว่าอุปกรณ์อินพุตใดทำอะไรได้บ้าง (aka "หน้าจอสัมผัส
Kindle Support ครอบคลุมผู้เล่นตัวจริง Kindle เต็มรูปแบบเริ่มต้นจาก K2
การสนับสนุน Kobo ครอบคลุมผู้เล่นตัวจริงของ Kobo เต็มรูปแบบเริ่มต้นจาก Kobo Touch A/B/C (หมายเหตุ: คุณสมบัติบางอย่างไม่พร้อมใช้งานบน Sunxi SoCs, CF, เอกสาร API)
การสนับสนุน BQ Cervantes ได้รับการสนับสนุนจาก @Pazos (#17) และควรจัดการผู้เล่นตัวจริงในปัจจุบัน
การสนับสนุนที่น่าทึ่งได้รับการสนับสนุนจาก @tcrs (#41) และสนับสนุน RM2 เมื่อจับคู่กับหนึ่งในการใช้งาน RM2FB Shim ต่างๆ
การสนับสนุน PocketBook ได้รับการทดสอบโดย @ezdiy (#47) และควรรองรับอุปกรณ์ชุดเดียวกับเกาหลี โปรดทราบว่า PocketBook เป็น ... แพลตฟอร์มที่ซับซ้อนในการจัดการและฉันไม่สามารถเข้าถึงได้ด้วยตัวเอง หมายความว่ามีนิสัยใจคอไม่กี่คนที่เกี่ยวข้อง:
fbink_get_fb_info
เสมอ แทนที่จะหันไปใช้ IOCTLs พื้นเมืองด้วยตัวคุณเองFBINK_NO_INKVIEW
ในสภาพแวดล้อมของคุณ ปัจจุบันข้อเสียเพียงอย่างเดียวคือการระบุอุปกรณ์ที่บกพร่อง: โดยเฉพาะไม่มีชื่ออุปกรณ์และ DPI ที่ไม่ถูกต้อง (เราจะเริ่มต้นเป็น 212 เว้นแต่คุณจะตั้งค่าการแทนที่ผ่าน FBINK_FORCE_DPI
env var))FBINK_NO_SW_ROTA
ในสภาพแวดล้อมของคุณซึ่งในกรณีนี้เราจะวาดรูปแบบ FB ดั้งเดิมเสมอ หากแทนที่จะ เขียน ลงใน FrameBuffer คุณต้องการ คว้า ภาพรวมของ PNG (ซึ่งสามารถมีประโยชน์ได้) ฉันมี FBGrab รุ่นที่ดัดแปลงมาอย่างหนักซึ่งควรจัดการกับความแปลกประหลาดของ Eink Framebuffers;) หากคุณไม่ต้องการไฟล์ PNG จริง ๆ และต้องการเล่นกับการถ่ายโอนข้อมูล FB ในหน่วยความจำให้ดูที่การโทร fbink_dump
& fbink_restore
API ทั้งหมด
เพื่อให้ทุกคนได้รับความสนุกสนานแม้ว่าคุณจะไม่สามารถยืน C ได้!
สนิม:
Go: Go-fbink และผู้สืบทอด Go-Fbink-V2 โดย @shermp
luajit: lua-fbink โดย @niluje
Python: py-fbink โดย @niluje
โปรดทราบว่าเนื่องจาก API อาจไม่เสถียรใน Master ทั้งหมดสิ่งเหล่านี้ทั้งหมดถูกผูกติดอยู่กับแท็กเฉพาะ (โดยทั่วไปการเปิดตัวล่าสุด) คุณควรให้เกียรติข้อกำหนดนั้นหรือนรกทั้งหมดจะหลุดออกมา;)
โดยทั่วไปฉันพยายามที่จะทำลายอย่างน้อยที่สุดหรือยกเว้นว่าทำให้เส้นทางการอัพเกรดไม่เจ็บปวดที่สุดเท่าที่จะเป็นไปได้ แต่ที่นั่นคุณมีมันสนับสนุนสิ่งใหม่ ๆ มักจะหมายถึงสิ่งที่มีอยู่ต้องทำงานแตกต่างกันเล็กน้อย
ฉันพยายามที่จะให้รายละเอียดการแตกหักของ API/ABI ในความคิดเห็นของแต่ละแท็ก แต่เป็นวิธีที่ดีในการมองเห็นว่าแน่นอนว่าจะแตกต่างจากส่วนหัวสาธารณะเดียว (หรือสำหรับภาพรวมที่ไม่มีบริบทอย่างรวดเร็วส่วนหัวขั้นต่ำที่สร้างขึ้นสำหรับการผูก FFI);)