วิธีใช้ / dev / fb0 เป็นคอนโซลจาก userspace หรือส่งข้อความออกไป


24

ดังนั้นฉันมีรุ่น Palm Pre (P100EWW ดั้งเดิม) ที่ฉันเปิดใช้งานโหมดผู้พัฒนาและติดตั้ง Debian Squeeze chroot ใช้งานได้ดี ฉันมีแผนที่จะใช้สิ่งนี้เพื่อสิ่งใดสิ่งหนึ่ง (bittorrent peer, เว็บเซิร์ฟเวอร์) แต่เป็นโทรศัพท์

ฉันสังเกตว่าถ้าฉันทำcat /dev/urandom > /dev/fb0มันจริง ๆ แล้วเขียนพิกเซลสุ่มไปที่หน้าจอจนกว่าจะเกิดNo space left on deviceข้อผิดพลาด เยี่ยมมากตอนนี้ฉันสามารถใช้จอแสดงผลได้แล้ว

ดังนั้นชนิดของการใช้ประโยชน์ที่จะมี A) ให้ฉันใช้ / dev / fb0 เป็นคอนโซลฉันสามารถส่งออกข้อความไปยังหรือ B) แสดงข้อความบน / dev / fb0 จากบรรทัดคำสั่ง

ฉันยังไม่รู้เกี่ยวกับการคอมไพล์เคอร์เนลใหม่สำหรับเรื่องนี้ (ในที่สุดฉันก็อยากจะตัด WebOS ออกทั้งหมดและเปลี่ยนมันให้เป็นเซิร์ฟเวอร์ ARM ขนาดเล็กที่สุด) ดังนั้นเครื่องมือผู้ใช้ถ้าพวกมันมีอยู่ก็คือสิ่งที่ฉันถาม ยังต้องการแสดงผลโดยตรงกับ / dev / fb0 และไม่ใช้ X


คอนโซลเสมือน Linux ควรทำงานกับไดร์เวอร์ framebuffer คอนโซลเสมือนเป็นเครื่องมือที่ทรงพลัง ตั้งแต่ Linux 2.6 พวกเขาอนุญาตให้ตั้งค่าแบบอักษรที่แตกต่างกันสำหรับแต่ละคอนโซล แต่จะถูกควบคุม (จาก userspace) ผ่าน / dev / vcs  nและ / dev / vcsa  nไม่ใช่ / dev / fb0
Incnis Mrsi

คำตอบ:


11

ในการใช้ framebuffer เป็นคอนโซลคุณต้องใช้fbdevโมดูล คุณอาจต้องคอมไพล์เคอร์เนลของคุณใหม่

คุณอาจสนใจโครงการ DirectFB ซึ่งเป็นห้องสมุดที่ทำให้การใช้ framebuffer ง่ายขึ้น นอกจากนี้ยังมีแอปพลิเคชั่นและสภาพแวดล้อม GUI ที่เขียนขึ้นสำหรับมันแล้ว


1
ดูเหมือนว่าเมื่อฉันติดตั้ง Directfb ( webos-internals.org/wiki/Directfb ) มันมาพร้อมกับยูทิลิตี้ที่เรียกว่าdfbgซึ่งช่วยให้ฉันใส่ภาพไว้ที่นั่น (และไม่ลบออกเมื่อเสร็จสิ้นเช่นfbi) ฉันรู้ว่าฉันจะสามารถหาโปรแกรมที่จะสร้าง .png หรือคล้ายกันจากข้อความบล็อกนั้นอาจเพียงแค่นี้การทำงาน ...
LawrenceC

24

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

  • zhcon ( Debian ) - เทอร์มินัลเสมือน userspace มุ่งสู่การจัดการ CJK I / O ได้ดีกว่าระบบย่อยของเคอร์เนล ความแข็งแรงโดยเฉพาะในการจัดการการเข้ารหัสที่ไม่ใช่ UTF ISO 2022; จุดอ่อนของมันคือการเข้ารหัส UTF
  • fbterm ( Debian ) - ทาง userspace terminal เสมือนว่าได้กลับกลายส้อมหลายคนรวมทั้งjfbterm มีพวงของวิธีการป้อนข้อมูล CJK พวง
  • bogl-bterm ( Debian ) - ทาง userspace terminal เสมือนว่าได้กลับกลายส้อมเช่นniterm
  • อาลี Gholami ฤดีของfbpad - เรียบง่าย userspace terminal เสมือนที่มีการอ้างอิงที่ไม่มีในห้องสมุด X
  • console-terminal-emulatorและconsole-fb-realizerเครื่องมือในNosh - เป็น userspace terminal เสมือนมุ่งเป้าไปที่การจำลอง Linux และ FreeBSD / PC-BSD เคอร์เนลอาคารเสมือน มันไม่มีการอ้างอิงในไลบรารี X ด้วยเช่นกัน
  • kmscon - เทอร์มินัลเสมือน userspace ที่เชื่อมโยงอย่างใกล้ชิดกับlogindเซิร์ฟเวอร์ใน systemd และแนวคิดของ "ที่นั่ง"

โดยเฉพาะอย่างยิ่ง Ali Gholami Rudi ได้ผลิตมากกว่าตัวจำลองเทอร์มินัลสำหรับการทำงานเฟรมเฟรม นอกจากนี้เขายังได้เขียนโปรแกรมดูไฟล์ PDF โดยตรงไปยังเฟรมเกอร์, โปรแกรมดู VNC, โปรแกรมเล่นสื่อและโปรแกรมอ่านกุรอาน

การเปรียบเทียบแบบเคียงข้างกันเต็มไปด้วยขอบเขตของคำตอบนี้ แต่นี่คือบางประเด็นที่เกี่ยวข้องกับคำถาม:

  • ตามที่ระบุไว้โปรแกรมเทอร์มินัลเสมือนพื้นที่ผู้ใช้หลายแห่งใช้ประโยชน์จากไลบรารี X สำหรับการจัดการแบบอักษรการแมปแป้นพิมพ์วิธีการป้อนข้อมูล CJK และอื่น ๆ พวกเขาไม่ใช่ไคลเอนต์ X แต่มีการพึ่งพาจากไลบรารี X fbpadและเครื่องมือ nosh โดยการออกแบบไม่ได้ใช้ประโยชน์จากไลบรารี X ใด ๆ
  • โปรแกรมที่ใช้ไลบรารี X สำหรับการจัดการแบบอักษรแน่นอนว่าใช้แบบอักษร X คนอื่นทำข้อตกลงอื่น ๆ
    • bogl-bterm และ fbpad ต่างก็มีรูปแบบฟอนต์ หนึ่งแปลงฟอนต์ BDF เป็นฟอนต์ BOGL ด้วยbdftoboglเครื่องมือ และอีกหนึ่งแปลง TTF เป็นฟอนต์ "tinyfont" ที่ใช้โดย fbpad ด้วยเครื่องมือ ft2tf ( Arch )
    • console-fb-realizerเครื่องมือnosh ใช้ฟอนต์ "vt" เช่นเดียวกับระบบย่อยเสมือนใหม่ของเคอร์เนล FreeBSD 10.1 เคอร์เนลจึงใช้เครื่องมือจัดการฟอนต์ FreeBSD vtfontcvtสำหรับแปลงฟอนต์ BDF
  • โปรแกรมที่ใช้ไลบรารี X ใช้การแมป X keyboard สำหรับคนอื่น ๆ :
    • เครื่องมือ nosh มีรูปแบบแผนที่แป้นพิมพ์ที่เป็นนิสัยของตัวเองโดยมีวัตถุประสงค์เพื่อจัดหาแป้นพิมพ์ที่มีความสามารถ ISO 9995-3 แบบเต็มพร้อมกับกลุ่ม "ทั่วไป" ISO 2 หนึ่งแปลงไฟล์ BSD kbdmap เป็นรูปแบบนี้ด้วยconsole-convert-kbdmapเครื่องมือ อีกครั้งไฟล์ kbdmap เหล่านี้เป็นคนที่ใช้กับระบบย่อย VT FreeBSD / PC-BSD
    • fbpad ไม่ได้ทำการแมปคีย์บอร์ดของตัวเองเลยและขึ้นอยู่กับการปรากฏตัวของระบบย่อยเทอร์มินัลเสมือนเคอร์เนลและกลไกการแม็พคีย์บอร์ดของมัน
  • มีความแปรปรวนบางอย่างในการเรียกใช้และสิทธิ์ที่จำเป็น:
    • zhcon, fbterm, bogl-bterm, fbpad และ kmscon ทำงานบนพื้นฐานที่เทอร์มินัลอีมูเลเตอร์วางไข่โปรแกรมเชลล์ / ล็อกอินบนเทอร์มินัลโดยตรงเป็นกระบวนการลูก พวกเขาจำเป็นต้องสิทธิ์ superuser loginเพื่อวางไข่
    • เครื่องมือ nosh ได้รับการออกแบบให้ทำงานร่วมกับ/etc/ttys(BSD) ที่มีอยู่, /etc/inittab(ระบบ Linux 5 init) หรือระบบอื่น ๆ ที่พวกเขาออกจากงานของการวางไข่ getty / login / shell console-fb-realizerเพียงต้องการสิทธิ์ที่เพียงพอในการเปิดอุปกรณ์ framebuffer และอินพุตซึ่งไม่จำเป็นต้องมีสิทธิ์ superuser และเข้าถึง FIFO และไฟล์ทั่วไปที่ดูแลโดยconsole-terminal-emulatorซึ่งไม่จำเป็นต้องมีสิทธิ์พิเศษใด ๆ เลย

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

  • bogl-bterm เป็นหลักสูตรที่สร้างขึ้นจาก Ben Graphics ของห้องสมุด Ben's Benfaff ซึ่งเป็นห้องสมุดกรอบ I / O ที่ได้รับการออกแบบมาเพื่อใช้ในสภาพแวดล้อมการตั้งค่า / ช่วยเหลือระบบ (และ"สำหรับ GUI ใน PDAs" ) แน่นอนคุณสามารถเขียนโปรแกรมที่ใช้โดยตรง
  • สำหรับบ้านกึ่งกลางระหว่างการเขียนโปรแกรมที่ใช้ไลบรารี framebuffer เพื่อทำการเรนเดอร์ของตัวเองและโปรแกรมที่แยกลำดับการหลบหนีออกจากสิ่งที่คิดว่าเป็นเทอร์มินัล: เทอร์มินัลเสมือนพื้นที่ผู้ใช้ของ Nosh นั้นแยกส่วน ชิ้นส่วน console-terminal-emulatorหนึ่งก็ไม่สามารถใช้

    console-fb-realizerใช้ไฟล์แสดงผลที่มีอาร์เรย์เซลล์อักขระเช่น/dev/vcsa*แต่ไฟล์ธรรมดา (ไม่ใช่ไฟล์อุปกรณ์อักขระพิเศษ) และด้วยจุดโค้ด Unicode, แอตทริบิวต์ ECMA-48 และสี RGB 24 บิต ดังนั้นเราจึงสามารถรันมันขึ้นมาและเขียน character + attribute + color ลงในไฟล์อาร์เรย์เซลล์อักขระโดยตรงโดยปล่อยให้console-fb-realizerฟอนต์เรนเดอร์ไปยัง framebuffer

    เช่นกัน: สังเกตว่านี่เป็นตรงข้ามของการทำงานร่วมกับ BRLTTYซึ่งใช้แต่ไม่ได้ทำงานconsole-terminal-emulatorconsole-fb-realizer


1
นี่คือคำตอบที่น่าอัศจรรย์ ห้องสมุดตรัสรู้เรียกร้องการสนับสนุน framebuffer บนลินุกซ์fbcon- ขึ้นอยู่กับตัวเลือกเวลารวบรวม นี้ยังเป็นจริงของจำลอง terminal ขึ้นของพวกเขาศัพท์ : ธิโดยตรงใน framebuffer ลินุกซ์ (fbcon) อื่น ๆ กว่าterminologyผมสองkmscon (และงานอื่น ๆ ของดาวิดมานน์)คำแนะนำตัวเอง
mikeserv

1
ฤดีเป็นปรมาจารย์เฟรม! วันหนึ่งฉันจะทิ้ง X11 ด้วย
Ciro Santilli 新疆改造中心法轮功六四事件

10

หากคุณสามารถแมว/dev/urandom > /dev/fb0และรับพิกเซลสุ่มบนหน้าจอคุณมีทุกอย่างที่คุณต้องการ

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

ใน busybox หรือใน raspi ของคุณคุณควรมีfbsetเลขฐานสอง นี่อาจช่วยให้คุณค้นพบการตั้งค่าของคุณเป็นขนาดหน้าจอ

ในตัวฉันมีลักษณะเช่นนี้:

# fbset

mode "480x272-1"
    # D: 0.104 MHz, H: 0.207 kHz, V: 0.657 Hz
    geometry 480 272 480 272 16
    timings 9600000 3 3 0 32 17 11
    accel false
    rgba 5/0,6/5,5/11,0/0
endmode

ส่วนที่สำคัญคือความกว้าง 480 และความสูง 272 พิกเซล

ตามที่คุณกล่าวถึงคุณสามารถเติมเต็มหน้าจอด้วย cat /dev/urandom > /dev/fb0

และคุณสามารถล้างมันด้วย cat /dev/zeros > /dev/fb0

กว่าล้างหน้าจอของคุณเราจะต้องมั่นใจว่าคุณได้รับมิติอย่างถูกต้อง

โดยบังเอิญ busybox ของฉันมีไบนารี fbsplash ที่ได้รับเป็นอินพุตไฟล์. ppm

ถูกต้องหากฉันผิด แต่ดูเหมือนว่าfb0จะยอมรับรูปแบบนี้ ลองดูที่Portable Anymap บน Wikipediaมี "subformats" หลายรูปแบบ ... fbsplash ใช้รูปแบบที่มีสีสันและอื่น ๆ ... แต่เราต้องการที่จะพิมพ์สิ่งที่อ่านได้ ลองใช้รหัส P1 ใน ASCII เพื่อความเรียบง่าย หากเราสามารถพิมพ์เส้นแนวตั้งเราจะรู้ว่าขนาดของเราถูกต้อง มาลองดูกัน:

เส้นแนวตั้งในประเภท ppm P1 ควรมีลักษณะดังนี้:

P1
480 272
f 0 0 0 0 ... 0 
f 0 0 0 0 ... 0
... 
f 0 0 0 0 ... 0

ดังนั้นจะมี 272 บรรทัดกว้าง 959 ตัวอักษร เอกสารบอกว่าควรเป็น 1 แทนที่จะเป็น f ... บน busybox และ raspi f นั้นสว่าง

เป็นสิ่งสำคัญที่คุณจะไม่มีที่ว่างหลังจาก 0 ของ ... งานนี้อาจค่อนข้างน่าเบื่อ ... คุณควรใช้โปรแกรมแก้ไขข้อความที่ช่วยคุณได้ดีกว่า ในเสียงเรียกเข้าคุณสามารถคัดลอกสองบรรทัดแรกไปที่โหมดคำสั่ง (esc) กว่าพิมพ์ตัวอักษรต่อไปนี้:

of(esc)479a 0(esc)yy271p

แน่นอนฉันกำลังใช้มิติของฉันคุณควรจะใช้ของคุณ วางไฟล์นี้ลงไฟล์/dev/fb0ควรมีลักษณะดังนี้: หน้าจอเส้นแนวตั้ง

โอเคฉันกำลังโกง ... มันไม่ใช่แค่หนึ่งบรรทัดที่นั่น ... มันประมาณ 8 ... แต่เมื่อมันไม่ทำงาน (เรามีมิติที่ผิดหรือเรามีที่ว่างตอนท้ายเพื่อที่จะมีเพียงหนึ่งบรรทัดมาก ได้ง่ายขึ้น)

ถ้าคุณไปไกลขนาดนั้นเราเพียงแค่พิมพ์พิกเซลที่ถูกต้องเพื่อดูเป็นตัวอักษร ขอบคุณMarcel Sondaar และ repo ของเขาบน GitHubเราไม่จำเป็นต้องวาดถ่านแต่ละอัน

ด้วย tweak ขนาดเล็กหนึ่งขยายโปรแกรมง่าย ๆ ของเขาที่จะพิมพ์fแทนXและ0แทนที่จะเป็นช่องว่างให้แทรกช่องว่างระหว่างตัวละครแต่ละตัวเพิ่มส่วนหัวและเรามีไฟล์. ppm ที่มีตัวอักษรที่เกี่ยวข้องกับรหัสของมัน

อีกหนึ่งขั้นตอนต่อไปและคุณจะไม่ได้รับตัวอักษรตัวใหญ่ แต่เป็นตัวอักษร วางไฟล์, ไพพ์เข้ากับโปรแกรมและเอาท์พุทของ/dev/fb0คุณและคุณจะได้รับข้อความ:

ตัวอย่างของการส่งข้อความ

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


2

สำหรับด้านคอนโซลคุณสามารถ echo สิ่งของ/dev/consoleหรือคุณสามารถใช้ syslog และขึ้นอยู่กับการตั้งค่าอื่น ๆ มันอาจปรากฏขึ้นบนคอนโซล

สำหรับรูปภาพฉันเพิ่งลองแปลงไฟล์ bmp เป็น fb0 และใช้งานได้จริง! (sortof - สำเนาหลายชุดมีขนาดเล็กกว่า)

ผมพบว่าโปรแกรม BMP เพื่อ framebuffer ที่นี่ นั่นควรเป็นตัวอย่างที่สมบูรณ์แบบของรูปแบบที่ fb0 คาดหวัง นอกจากนี้ยังfbiมีโปรแกรมสำหรับเขียนโดยตรงไปยังเฟรมบัฟเฟอร์


fbiอนุญาตให้ฉันใส่รูปภาพบนหน้าจอซึ่งมีประโยชน์ แต่มันจะลบ framebuffer เมื่อมันออก
LawrenceC

0

มันเป็นโพสต์เก่า แต่ฉันเข้าใจว่าโดยปกติคุณต้องใช้ framebuffer console (fbcon) เพื่อใช้ console ใน framebuffer มันอยู่ในการกำหนดค่า (ไดรเวอร์อุปกรณ์ / กราฟิก / คอนโซลจอแสดงผล .. )

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.