NETGEAR is aware of a growing number of phone and online scams. To learn how to stay safe click here.

Forum Discussion

bcshark's avatar
bcshark
Aspirant
Aug 05, 2026

LCD panel serial protocol correct but not working on Ultra 6 Plus — troubleshooting help?

Referencing this older thread where the LCD protocol was worked out: [ReadyNAS Ultra 6 - Replace OS with any linux distro...]

 

I'm running Debian on a ReadyNAS Ultra 6 Plus and trying to get the front panel LCD working, using the documented protocol from the old NexentaStor forum post quoted in that thread:

 

echo "E" > /dev/ttyS1 # clear

sleep 0.5

echo "L text" > /dev/ttyS1 # write text

 

I've confirmed:

- /dev/ttyS1 is a real second UART (I/O 0x2f8, 16550A chip)

- Tried every standard baud rate (1200–115200)

- 8N1 framing, as both root and a regular user in the tty/dialout groups

 

No reaction on the display at any combination. Has anyone gotten this actually working on an Ultra 6 Plus specifically (not just the base Ultra 6)?

 

Curious whether:

- The "Plus" variant might use different wiring/settings

- Anyone needed non-8N1 framing (parity, 2 stop bits)

- Anyone found the exact working baud rate for their unit

 

Any pointers appreciated!

1 Reply

  • ▎ Solved it. Turns out the plain E / L string protocol from this thread (and the Nexenta forum post) is directionally right but missing two details that made it silently fail no matter what baud rate or framing I tried:

    ▎ 1. The panel's PIC firmware needs the port left at its default termios settings — don't stty it to anything explicitly, just open and write.

    ▎ 2. Every line write needs a cursor-position command immediately before it — C <col_hex> <row_hex>\r — even if you already positioned it earlier. Skipping this is why bare L text\r never did anything.

    ▎ I found this by pulling NETGEAR's own GPL source for RAIDiator-x86 (readynas-x86-kernel-modules/pro/lcd/nv6lcd.c in the 4.2.27 GPL release — their live download portal blocks bots, but it's recoverable via the Wayback Machine's CDX API if anyone else needs to dig up old NETGEAR GPL releases).

    ▎ Full command set from that driver:

    ▎ | Command | Meaning |

    ▎ |---------------------------|---------------------------------------|

    ▎ | E\r | Clear screen |

    ▎ | D 0|1|2\r | Backlight off / on / dim |

    ▎ | P 0\r | Stop progress bar (sent at init) |

    ▎ | F 0\r | Font select |

    ▎ | C <col_hex> <row_hex>\r | Position cursor (hex, no 0x) |

    ▎ | L<26-char padded text>\r | Write text at current cursor position |

    ▎ | B 8 A 0 <8 hex bytes> 0\r | Draw an 8x10 disk-status bitmap icon |

    ▎ Disk icons sit at columns 0/8/10 (hex), row 0 for disks 1-3 and row D for disks 4-6. Text lines start at column 18 (right after the icon columns).

    ▎ Working Python driver, port /dev/ttyS1, one open/write/close cycle per command:

    ▎ #!/usr/bin/env python3

    ▎ import os, sys, time

    ▎ PORT = "/dev/ttyS1"

    ▎ DISK_POS = {1: "0 0", 2: "8 0", 3: "10 0", 4: "0 D", 5: "8 D", 6: "10 D"}

    ▎ BITMAP_STD = {

    ▎ 1: "B 8 A 0 7F 41 49 59 49 49 5D 41 7F 0",

    ▎ 2: "B 8 A 0 7F 41 5D 45 5D 51 5D 41 7F 0",

    ▎ 3: "B 8 A 0 7F 41 5D 45 5D 45 5D 41 7F 0",

    ▎ 4: "B 8 A 0 7F 41 55 55 5D 45 45 41 7F 0",

    ▎ 5: "B 8 A 0 7F 41 5D 51 5D 45 5D 41 7F 0",

    ▎ 6: "B 8 A 0 7F 41 5D 51 5D 55 5D 41 7F 0",

    ▎ }

    ▎ BITMAP_BLANK = "B 8 A 0 7F 41 41 41 41 41 41 41 7F 0"

    ▎ BITMAP_FAIL = "B 8 A 0 7F 41 63 55 49 55 63 41 7F 0"

    ▎ def _send(cmd):

    ▎ fd = os.open(PORT, os.O_RDWR)

    ▎ os.write(fd, cmd.encode())

    ▎ os.close(fd)

    ▎ def _delay(ms):

    ▎ time.sleep(ms / 1000.0)

    ▎ def clear():

    ▎ _delay(100); _send("E\r")

    ▎ def backlight(mode):

    ▎ _send("D %d\r" % {"off": 0, "on": 1, "dim": 2}[mode])

    ▎ def disk_icon(num, state):

    ▎ bitmap = {"std": BITMAP_STD[num], "blank": BITMAP_BLANK, "fail": BITMAP_FAIL}[state]

    ▎ _delay(150)

    ▎ _send("C %s\r" % DISK_POS[num])

    ▎ _send(bitmap + "\r")

    ▎ def _line(row_hex, text):

    ▎ _delay(100)

    ▎ _send("C 18 %s\r" % row_hex)

    ▎ _send("L" + text[:26].ljust(26) + "\r")

    ▎ def line1(text): _line("0", text)

    ▎ def line2(text): _line("D", text)

    ▎ def init_screen():

    ▎ _delay(100); _send("P 0\r")

    ▎ _delay(100); _send("P 0\r")

    ▎ clear()

    ▎ _delay(100); _send("E\r")

    ▎ _delay(100); _send("D 1\r")

    ▎ _delay(100); _send("D 1\r")

    ▎ for d in range(1, 7):

    ▎ disk_icon(d, "blank")

    ▎ _delay(100); _send("F 0\r")

    ▎ line1("ReadyNAS")

    ▎ line2("")

    ▎ if __name__ == "__main__":

    ▎ action = sys.argv[1]

    ▎ if action == "init": init_screen()

    ▎ elif action == "clear": clear()

    ▎ elif action == "line1": line1(sys.argv[2])

    ▎ elif action == "line2": line2(sys.argv[2])

    ▎ elif action == "backlight": backlight(sys.argv[2])

    ▎ elif action == "disk": disk_icon(int(sys.argv[2]), sys.argv[3])

    ▎ Run as root, e.g. sudo python3 nv6lcd.py init or sudo python3 nv6lcd.py line1 "hello".

NETGEAR Academy

Boost your skills with the Netgear Academy - Get trained, certified and stay ahead with the latest Netgear technology! 

Join Us!

ProSupport for Business

Comprehensive support plans for maximum network uptime and business peace of mind.

 

Learn More