PfSense on a Celestix S-X MSA 4000



  • @stephenw10 Thanks for that info.

    Finally managed to get pfSense amd64 version 2.1 up and running from the CompactFlash.

    These units have a lot of potential because the BIOS is full read and write access so no BIOS flashing required, plenty of I/O available, SVGA, IDE, SATA, CF, mini-PCI slot, USB and com ports.

    
    [2.1-RELEASE][root@pfSense.localdomain]/root(1): dmesg
    Copyright (c) 1992-2012 The FreeBSD Project.
    Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994
            The Regents of the University of California. All rights reserved.
    FreeBSD is a registered trademark of The FreeBSD Foundation.
    FreeBSD 8.3-RELEASE-p11 #0: Wed Sep 11 19:29:56 EDT 2013
        root@snapshots-8_3-amd64.builders.pfsense.org:/usr/obj.pfSense/usr/pfSensesrc/src/sys/pfSense_wrap.8.amd64 amd64
    Timecounter "i8254" frequency 1193182 Hz quality 0
    CPU: Intel(R) Pentium(R) D CPU 3.00GHz (2990.34-MHz K8-class CPU)
      Origin = "GenuineIntel"  Id = 0xf65  Family = f  Model = 6  Stepping = 5
      Features=0xbfebfbff <fpu,vme,de,pse,tsc,msr,pae,mce,cx8,apic,sep,mtrr,pge,mca,cmov,pat,pse36,clflush,dts,acpi,mmx,fxsr,sse,sse2,ss,htt,tm,pbe>Features2=0xe49d <sse3,dtes64,mon,ds_cpl,est,cnxt-id,cx16,xtpr,pdcm>AMD Features=0x20100800 <syscall,nx,lm>AMD Features2=0x1 <lahf>TSC: P-state invariant
    real memory  = 4294967296 (4096 MB)
    avail memory = 3340812288 (3186 MB)
    ACPI APIC Table: <intelr awrdacpi="">FreeBSD/SMP: Multiprocessor System Detected: 2 CPUs
    FreeBSD/SMP: 1 package(s) x 2 core(s)
     cpu0 (BSP): APIC ID:  0
     cpu1 (AP): APIC ID:  1
    ioapic0: Changing APIC ID to 4
    ioapic0 <version 2.0="">irqs 0-23 on motherboard
    wlan: mac acl policy registered
    ipw_bss: You need to read the LICENSE file in /usr/share/doc/legal/intel_ipw/.
    ipw_bss: If you agree with the license, set legal.intel_ipw.license_ack=1 in /boot/loader.conf.
    module_register_init: MOD_LOAD (ipw_bss_fw, 0xffffffff8041ca10, 0) error 1
    ipw_ibss: You need to read the LICENSE file in /usr/share/doc/legal/intel_ipw/.
    ipw_ibss: If you agree with the license, set legal.intel_ipw.license_ack=1 in /boot/loader.conf.
    module_register_init: MOD_LOAD (ipw_ibss_fw, 0xffffffff8041cab0, 0) error 1
    ipw_monitor: You need to read the LICENSE file in /usr/share/doc/legal/intel_ipw/.
    ipw_monitor: If you agree with the license, set legal.intel_ipw.license_ack=1 in /boot/loader.conf.
    module_register_init: MOD_LOAD (ipw_monitor_fw, 0xffffffff8041cb50, 0) error 1
    cryptosoft0: <software crypto="">on motherboard
    padlock0: No ACE support.
    acpi0: <intelr awrdacpi="">on motherboard
    acpi0: [ITHREAD]
    acpi0: Power Button (fixed)
    acpi0: reservation of 0, a0000 (3) failed
    acpi0: reservation of 100000, cf5e0000 (3) failed
    Timecounter "ACPI-fast" frequency 3579545 Hz quality 1000
    acpi_timer0: <24-bit timer at 3.579545MHz> port 0x408-0x40b on acpi0
    cpu0: <acpi cpu="">on acpi0
    cpu1: <acpi cpu="">on acpi0
    acpi_button0: <power button="">on acpi0
    pcib0: <acpi host-pci="" bridge="">port 0xcf8-0xcff on acpi0
    pci0: <acpi pci="" bus="">on pcib0
    vgapci0: <vga-compatible display="">port 0xff00-0xff07 mem 0xfdf00000-0xfdf7ffff,0xd0000000-0xdfffffff,0xfdf80000-0xfdfbffff irq 16 at device 2.0 on pci0
    pcib1: <acpi pci-pci="" bridge="">irq 16 at device 28.0 on pci0
    pci1: <acpi pci="" bus="">on pcib1
    em0: <intel(r) 1000="" pro="" network="" connection="" 7.3.2="">port 0x8f00-0x8f1f mem 0xfd6e0000-0xfd6fffff irq 16 at device 0.0 on pci1
    em0: Using an MSI interrupt
    em0: [FILTER]
    pcib2: <acpi pci-pci="" bridge="">irq 17 at device 28.1 on pci0
    pci2: <acpi pci="" bus="">on pcib2
    em1: <intel(r) 1000="" pro="" network="" connection="" 7.3.2="">port 0x7f00-0x7f1f mem 0xfd2e0000-0xfd2fffff irq 17 at device 0.0 on pci2
    em1: Using an MSI interrupt
    em1: [FILTER]
    pcib3: <acpi pci-pci="" bridge="">irq 18 at device 28.2 on pci0
    pci3: <acpi pci="" bus="">on pcib3
    em2: <intel(r) 1000="" pro="" network="" connection="" 7.3.2="">port 0xdf00-0xdf1f mem 0xfdee0000-0xfdefffff irq 18 at device 0.0 on pci3
    em2: Using an MSI interrupt
    em2: [FILTER]
    pcib4: <acpi pci-pci="" bridge="">irq 19 at device 28.3 on pci0
    pci4: <acpi pci="" bus="">on pcib4
    em3: <intel(r) 1000="" pro="" network="" connection="" 7.3.2="">port 0xcf00-0xcf1f mem 0xfdce0000-0xfdcfffff irq 19 at device 0.0 on pci4
    em3: Using an MSI interrupt
    em3: [FILTER]
    pcib5: <acpi pci-pci="" bridge="">irq 16 at device 28.4 on pci0
    pci5: <acpi pci="" bus="">on pcib5
    em4: <intel(r) 1000="" pro="" network="" connection="" 7.3.2="">port 0xaf00-0xaf1f mem 0xfdae0000-0xfdafffff irq 16 at device 0.0 on pci5
    em4: Using an MSI interrupt
    em4: [FILTER]
    pcib6: <acpi pci-pci="" bridge="">irq 17 at device 28.5 on pci0
    pci6: <acpi pci="" bus="">on pcib6
    em5: <intel(r) 1000="" pro="" network="" connection="" 7.3.2="">port 0x9f00-0x9f1f mem 0xfd8e0000-0xfd8fffff irq 17 at device 0.0 on pci6
    em5: Using an MSI interrupt
    em5: [FILTER]
    uhci0: <intel 82801g="" (ich7)="" usb="" controller="" usb-a="">port 0xfe00-0xfe1f irq 23 at device 29.0 on pci0
    uhci0: [ITHREAD]
    usbus0: <intel 82801g="" (ich7)="" usb="" controller="" usb-a="">on uhci0
    uhci1: <intel 82801g="" (ich7)="" usb="" controller="" usb-b="">port 0xfd00-0xfd1f irq 19 at device 29.1 on pci0
    uhci1: [ITHREAD]
    usbus1: <intel 82801g="" (ich7)="" usb="" controller="" usb-b="">on uhci1
    uhci2: <intel 82801g="" (ich7)="" usb="" controller="" usb-c="">port 0xfc00-0xfc1f irq 18 at device 29.2 on pci0
    uhci2: [ITHREAD]
    usbus2: <intel 82801g="" (ich7)="" usb="" controller="" usb-c="">on uhci2
    uhci3: <intel 82801g="" (ich7)="" usb="" controller="" usb-d="">port 0xfb00-0xfb1f irq 16 at device 29.3 on pci0
    uhci3: [ITHREAD]
    usbus3: <intel 82801g="" (ich7)="" usb="" controller="" usb-d="">on uhci3
    ehci0: <intel 82801gb="" r="" (ich7)="" usb="" 2.0="" controller="">mem 0xfdfff000-0xfdfff3ff irq 23 at device 29.7 on pci0
    ehci0: [ITHREAD]
    usbus4: EHCI version 1.0
    usbus4: <intel 82801gb="" r="" (ich7)="" usb="" 2.0="" controller="">on ehci0
    pcib7: <acpi pci-pci="" bridge="">at device 30.0 on pci0
    pci7: <acpi pci="" bus="">on pcib7
    pci7: <encrypt decrypt,="" network="" computer="" crypto="">at device 2.0 (no driver attached)
    isab0: <pci-isa bridge="">at device 31.0 on pci0
    isa0: <isa bus="">on isab0
    atapci0: <intel ich7="" udma100="" controller="">port 0x1f0-0x1f7,0x3f6,0x170-0x177,0x376,0xf800-0xf80f at device 31.1 on pci0
    ata0: <ata channel="">at channel 0 on atapci0
    ata0: [ITHREAD]
    atapci1: <intel ich7="" sata300="" controller="">port 0xf700-0xf707,0xf600-0xf603,0xf500-0xf507,0xf400-0xf403,0xf300-0xf30f mem 0xfdffc000-0xfdffc3ff irq 19 at device 31.2 on pci0
    atapci1: [ITHREAD]
    ata2: <ata channel="">at channel 0 on atapci1
    ata2: [ITHREAD]
    ata3: <ata channel="">at channel 1 on atapci1
    ata3: [ITHREAD]
    pci0: <serial bus,="" smbus="">at device 31.3 (no driver attached)
    acpi_tz0: <thermal zone="">on acpi0
    atrtc0: <at realtime="" clock="">port 0x70-0x73 irq 8 on acpi0
    uart0: <16550 or compatible> port 0x3f8-0x3ff irq 4 flags 0x10 on acpi0
    uart0: [FILTER]
    uart0: console (9600,n,8,1)
    uart1: <16550 or compatible> port 0x2f8-0x2ff irq 3 on acpi0
    uart1: [FILTER]
    orm0: <isa option="" rom="">at iomem 0xef000-0xeffff on isa0
    ppc0: cannot reserve I/O port range
    acpi_perf0: <acpi cpu="" frequency="" control="">on cpu0
    Timecounters tick every 10.000 msec
    IPsec: Initialized Security Association Processing.
    usbus0: 12Mbps Full Speed USB v1.0
    usbus1: 12Mbps Full Speed USB v1.0
    ugen0.1: <intel>at usbus0
    uhub0: <intel 1="" 9="" uhci="" root="" hub,="" class="" 0,="" rev="" 1.00="" 1.00,="" addr="">on usbus0
    ugen1.1: <intel>at usbus1
    uhub1: <intel 1="" 9="" uhci="" root="" hub,="" class="" 0,="" rev="" 1.00="" 1.00,="" addr="">on usbus1
    usbus2: 12Mbps Full Speed USB v1.0
    usbus3: 12Mbps Full Speed USB v1.0
    ugen2.1: <intel>at usbus2
    uhub2: <intel 1="" 9="" uhci="" root="" hub,="" class="" 0,="" rev="" 1.00="" 1.00,="" addr="">on usbus2
    ugen3.1: <intel>at usbus3
    uhub3: <intel 1="" 9="" uhci="" root="" hub,="" class="" 0,="" rev="" 1.00="" 1.00,="" addr="">on usbus3
    usbus4: 480Mbps High Speed USB v2.0
    ad0: 3823MB <ts4gcf133 20110407="">at ata0-master PIO4
    ugen4.1: <intel>at usbus4
    uhub4: <intel 1="" 9="" ehci="" root="" hub,="" class="" 0,="" rev="" 2.00="" 1.00,="" addr="">on usbus4
    uhub0: 2 ports with 2 removable, self powered
    SMP: AP CPU #1 Launched!
    uhub1: 2 ports with 2 removable, self powered
    uhub2: 2 ports with 2 removable, self powered
    uhub3: 2 ports with 2 removable, self powered
    Root mount waiting for: usbus4
    Root mount waiting for: usbus4
    Root mount waiting for: usbus4
    Root mount waiting for: usbus4
    uhub4: 8 ports with 8 removable, self powered
    Trying to mount root from ufs:/dev/ufs/pfsense0
    ugen1.2: <vendor 0x0cb6="">at usbus1
    em5: link state changed to UP
    pflog0: promiscuous mode enabled
    [2.1-RELEASE][root@pfSense.localdomain]/root(2):</vendor></intel></intel></ts4gcf133></intel></intel></intel></intel></intel></intel></intel></intel></acpi></isa></at></thermal></serial></ata></ata></intel></ata></intel></isa></pci-isa></encrypt></acpi></acpi></intel></intel></intel></intel></intel></intel></intel></intel></intel></intel></intel(r)></acpi></acpi></intel(r)></acpi></acpi></intel(r)></acpi></acpi></intel(r)></acpi></acpi></intel(r)></acpi></acpi></intel(r)></acpi></acpi></vga-compatible></acpi></acpi></power></acpi></acpi></intelr></software></version></intelr></lahf></syscall,nx,lm></sse3,dtes64,mon,ds_cpl,est,cnxt-id,cx16,xtpr,pdcm></fpu,vme,de,pse,tsc,msr,pae,mce,cx8,apic,sep,mtrr,pge,mca,cmov,pat,pse36,clflush,dts,acpi,mmx,fxsr,sse,sse2,ss,htt,tm,pbe> 
    

    Just need to get the LCD display to work, does anybody know how to translate this into config for pfSense?
    ugen1.2: <vendor 0x0cb6="">at usbus1
    ukbd1: <vendor 0="" 2="" 0x0cb6="" keyboard="" +="" lcd,="" class="" 0,="" rev="" 1.10="" 1.00,="" addr="">on usbus1

    Also, I know the mini-PCI encryption card is not supported, is that down to the lack of drivers?
    pci7: <acpi pci="" bus="">on pcib7
    pci7: <encrypt decrypt,="" network="" computer="" crypto="">at device 2.0 (no driver attached)

    </encrypt></acpi></vendor></vendor>


  • Netgate Administrator

    6 em NICs nice.  :)
    Yes there's no driver for any of the cavium encryption chips. They only released any specs or drivers under NDAs and such so any driver for FreeBSD would have to be completely reverse engineered.

    I would start investigating the LCD by adding the lcdproc-dev package and trying some drivers. You may end up having to customize a driver to get the dial working.

    Steve



  • Thanks, I will follow your advice and try some USB LCD drivers.

    Regarding Cavium encryption chips, I’ve found the drivers for Windows 2003 server and they match the ones installed on my device.

    Check out the ftp site below and you see a Linux folder, I’ve extracted the contents and found some reference to BSD and FreeBSD but I don’t know what I’m looking at, it’s beyond my knowledge.  :-[

    [url=http://ftp://ftp.supermicro.com/CDR-X6_1.13_for_Intel_X6_platform/CAVIUM/]ftp://ftp.supermicro.com/CDR-X6_1.13_for_Intel_X6_platform/CAVIUM/


  • Netgate Administrator

    I don't see any reference to FreeBSD drivers there.  :(

    It's possible though: https://plus.google.com/104092656004159577193/posts/f7y8btzZBbW

    Steve



  • @stephenw10:

    I don't see any reference to FreeBSD drivers there.  :(

    Sorry my bad.

    Celestix S-X MSA 4000 Windows LCD driver info:

    Celestix S-X MSA 4000 example LCD messages under Window OS:

    Celestix S-X MSA 4000 display module:

    Manufacturer: Varitronix
    Model: MDLS-40263-LV-B-LED
    Product: LCD Character Display Modules
    Character Count x Line: 40 x 2


  • Netgate Administrator

    The LCD module looks pretty standard, the board it's mounted on looks more custom. It has the LEDs and the jog dial connected to it? The chip seems to be this:
    http://www.simkits.com/downloads/documents/CY7C63743.pdf
    If the USB to the LCD is just passed through then getting that going with lcdproc may not be too tricky.
    The fact that the device is detected as a USB device with Vendor ID 0cb6 is not good as that's Celestix themselves.

    What is the state of support for the Varitronix display in lcdproc?

    Steve



  • @stephenw10:

    What is the state of support for the Varitronix display in lcdproc?

    I think that’s part of the problem in that I don’t see any support for Varitronix display in lcdproc.  :'(

    In LCDproc file what would be the settings for:
    ugen1.2: <vendor 0x0cb6="">at usbus1
    ukbd0: <vendor 0="" 2="" 0x0cb6="" keyboard="" +="" lcd,="" class="" 0,="" rev="" 1.10="" 1.00,="" addr="">on usbus1

    Device=/dev/ugen1.2

    I hope i've this correct?

    Here is all the USB info i can find ;)

    
    [2.1-RELEASE][root@pfSense.localdomain]/dev(2): ls
    acpi       crypto     fd         mem        ttyu0.init ttyv8      ugen3.1
    ad4        ctty       fido       nfslock    ttyu0.lock ttyv9      ugen4.1
    ad4s1      cuau0      geom.ctl   null       ttyu1      ttyva      ukbd0
    ad4s1a     cuau0.init io         pci        ttyu1.init ttyvb      urandom
    ad4s1b     cuau0.lock kbd0       pf         ttyu1.lock ttyvc      usb
    agpgart    cuau1      kbd1       ptmx       ttyv0      ttyvd      usbctl
    ata        cuau1.init kbd2       random     ttyv1      ttyve      xpt0
    atkbd0     cuau1.lock kbdmux0    speaker    ttyv2      ttyvf      zero
    audit      dcons      klog       stderr     ttyv3      ufsid      zfs
    bpf        devctl     kmem       stdin      ttyv4      ugen0.1
    bpf0       devstat    led        stdout     ttyv5      ugen1.1
    console    dgdb       md0        sysmouse   ttyv6      ugen1.2
    consolectl dumpdev    mdctl      ttyu0      ttyv7      ugen2.1
    [2.1-RELEASE][root@pfSense.localdomain]/dev(3):
    
    2.1-RELEASE][root@pfSense.localdomain]/dev(3): dmesg | grep usb
    usbus0: <intel 82801g="" (ich7)="" usb="" controller="" usb-a="">on uhci0
    usbus1: <intel 82801g="" (ich7)="" usb="" controller="" usb-b="">on uhci1
    usbus2: <intel 82801g="" (ich7)="" usb="" controller="" usb-c="">on uhci2
    usbus3: <intel 82801g="" (ich7)="" usb="" controller="" usb-d="">on uhci3
    usbus4: EHCI version 1.0
    usbus4: <intel 82801gb="" r="" (ich7)="" usb="" 2.0="" controller="">on ehci0
    usbus0: 12Mbps Full Speed USB v1.0
    usbus1: 12Mbps Full Speed USB v1.0
    usbus2: 12Mbps Full Speed USB v1.0
    usbus3: 12Mbps Full Speed USB v1.0
    usbus4: 480Mbps High Speed USB v2.0
    ugen0.1: <intel>at usbus0
    uhub0: <intel 1="" 9="" uhci="" root="" hub,="" class="" 0,="" rev="" 1.00="" 1.00,="" addr="">on usbus0
    ugen1.1: <intel>at usbus1
    uhub1: <intel 1="" 9="" uhci="" root="" hub,="" class="" 0,="" rev="" 1.00="" 1.00,="" addr="">on usbus1
    ugen2.1: <intel>at usbus2
    uhub2: <intel 1="" 9="" uhci="" root="" hub,="" class="" 0,="" rev="" 1.00="" 1.00,="" addr="">on usbus2
    ugen3.1: <intel>at usbus3
    uhub3: <intel 1="" 9="" uhci="" root="" hub,="" class="" 0,="" rev="" 1.00="" 1.00,="" addr="">on usbus3
    ugen4.1: <intel>at usbus4
    uhub4: <intel 1="" 9="" ehci="" root="" hub,="" class="" 0,="" rev="" 2.00="" 1.00,="" addr="">on usbus4
    Root mount waiting for: usbus4 usbus3 usbus2 usbus1 usbus0
    Root mount waiting for: usbus4
    Root mount waiting for: usbus4
    ugen1.2: <vendor 0x0cb6="">at usbus1
    ukbd0: <vendor 0="" 2="" 0x0cb6="" keyboard="" +="" lcd,="" class="" 0,="" rev="" 1.10="" 1.00,="" addr="">on usbus1
    [2.1-RELEASE][root@pfSense.localdomain]/dev(4):
    
    [2.1-RELEASE][root@pfSense.localdomain]/dev(5): pciconf -lv
    uhci0@pci0:0:29:0:      class=0x0c0300 card=0x27c88086 chip=0x27c88086 rev=0x01 hdr=0x00
        class      = serial bus
        subclass   = USB
    uhci1@pci0:0:29:1:      class=0x0c0300 card=0x27c98086 chip=0x27c98086 rev=0x01 hdr=0x00
        class      = serial bus
        subclass   = USB
    uhci2@pci0:0:29:2:      class=0x0c0300 card=0x27ca8086 chip=0x27ca8086 rev=0x01 hdr=0x00
        class      = serial bus
        subclass   = USB
    uhci3@pci0:0:29:3:      class=0x0c0300 card=0x27ca8086 chip=0x27cb8086 rev=0x01 hdr=0x00
        class      = serial bus
        subclass   = USB
    ehci0@pci0:0:29:7:      class=0x0c0320 card=0x27cc8086 chip=0x27cc8086 rev=0x01 hdr=0x00
        class      = serial bus
        subclass   = USB
    [2.1-RELEASE][root@pfSense.localdomain]/dev(6):
    
    [2.1-RELEASE][root@pfSense.localdomain]/dev(6): usbconfig
    ugen0.1: <uhci root="" hub="" intel="">at usbus0, cfg=0 md=HOST spd=FULL (12Mbps) pwr=SAVE
    ugen1.1: <uhci root="" hub="" intel="">at usbus1, cfg=0 md=HOST spd=FULL (12Mbps) pwr=SAVE
    ugen2.1: <uhci root="" hub="" intel="">at usbus2, cfg=0 md=HOST spd=FULL (12Mbps) pwr=SAVE
    ugen3.1: <uhci root="" hub="" intel="">at usbus3, cfg=0 md=HOST spd=FULL (12Mbps) pwr=SAVE
    ugen4.1: <ehci root="" hub="" intel="">at usbus4, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=SAVE
    ugen1.2: <keyboard +="" lcd="" vendor="" 0x0cb6="">at usbus1, cfg=0 md=HOST spd=LOW (1.5Mbps) pwr=ON
    [2.1-RELEASE][root@pfSense.localdomain]/dev(7):
    
    [2.1-RELEASE][root@pfSense.localdomain]/dev(7): pciconf -l -cv
    uhci0@pci0:0:29:0:      class=0x0c0300 card=0x27c88086 chip=0x27c88086 rev=0x01 hdr=0x00
        class      = serial bus
        subclass   = USB
    uhci1@pci0:0:29:1:      class=0x0c0300 card=0x27c98086 chip=0x27c98086 rev=0x01 hdr=0x00
        class      = serial bus
        subclass   = USB
    uhci2@pci0:0:29:2:      class=0x0c0300 card=0x27ca8086 chip=0x27ca8086 rev=0x01 hdr=0x00
        class      = serial bus
        subclass   = USB
    uhci3@pci0:0:29:3:      class=0x0c0300 card=0x27ca8086 chip=0x27cb8086 rev=0x01 hdr=0x00
        class      = serial bus
        subclass   = USB
    ehci0@pci0:0:29:7:      class=0x0c0320 card=0x27cc8086 chip=0x27cc8086 rev=0x01 hdr=0x00
        class      = serial bus
        subclass   = USB
        cap 01[50] = powerspec 2  supports D0 D3  current D0
    [2.1-RELEASE][root@pfSense.localdomain]/dev(8):</keyboard></ehci></uhci></uhci></uhci></uhci></vendor></vendor></intel></intel></intel></intel></intel></intel></intel></intel></intel></intel></intel></intel></intel></intel></intel> 
    ```</vendor></vendor>

  • Netgate Administrator

    Hmm tricky. The datasheet for the Varitronix MDLS40263, PDF, appears to show that the onbaord controller chip requires some custom 8bit data protocol. May be less custom than I think, most LCDs seem to use something like this. I think it will all depend on how much custom code Celestix have put on the chip on their board. If it's all passed through and done in the driver then there is always a chance. If it's custom code in the chip then we have no idea how to talk to it.

    Edit: The LCDproc HD44780 driver appears to support the NT3881D IC in that display:
    @http://lcdproc.omnipotent.net/hardware.php3:

    hd44780 All displays using HD44780 and compatible controllers (like KS0066, KS0070, KS0076, LC7985, NT3881, SED1278, ST7066)

    It's likely a matter of figuring how the chip on the Celestix board separates the various devices, control knob, LEDs, lcd data lines.

    It seems other manufacturers have used that microcontroller for similar purposes. Google throws up some interesting results.

    Steve

    Edit: This looks promising:
    http://www.freebsd.org/cgi/man.cgi?query=ucycom&apropos=0&sektion=4&manpath=FreeBSD+8.3-RELEASE&arch=default&format=html
    It would require some mods to make it recognise the USB IDs.



  • Hello, just bought a couple of celestix appliances on an auction. I just spend a few minutes to start one of them with a VGA monitor connected. I noticed That  the system is booting up by first going into a GRUB bootloader. In this boot menu one can choose an recovery option. Choosing the recovery option the system boots into linux, with on the screen just a USB device driver. The lcd with jog dial shows a menu for the last good configuration or a restore of a Windows server 2003.

    So to me it Seems there should be a linux driver for the LCD/jog module on the hard disk.

    Good luck

    Marc


  • Netgate Administrator

    Interesting. The Linux driver's probably not much good to us in freebsd but if they're using lcdproc it will give some good clues.

    Steve



  • I think LCDProc i's not needed. it looks if they are only using shell scripts for the whole IO communication with the display.

    These scripts in /etc/init.d are calling a function "lcd_functions" in /etc/hardware/current where current is a variable ScorpioII Scorpio X ( al versions of the celestix appliances. And as a big suprise the function itself is not a compiled programm but a sh script!!!

    Ok this scripts calls a program in the Bin directory (Scorpio_readkey) that is communicating to a /dev/ttyX and has been compiled in GCC: (GNU) 3.2.2 20030109 (Debian prerelease)

    –---------------
    DEV="/dev/usb/scorpioLCD1"
    chvt 2

    lcd_write()
    {
    STR1=echo $* | cut -b1-80
    LASTSTR=$STR1
    STR=printf "%-80s" "$STR1"
    echo -n "$STR" > $DEV
    }

    format_line()
    {
    INSTR=$1
    INHILITE=$2

    if [ -n "$INSTR" ]
    then
    LEN=echo $INSTR | wc -m

    Check if string is longer than 36 characters

    if [ $LEN -gt 36 ]
    then
    START=$(($LEN-16))
    P1=echo $INSTR | cut -b 1-17
    P2=echo $INSTR | cut -b $START-
    STR="$P1…$P2"
    else
    STRx=echo $INSTR | cut -b 1-36
    STR=printf "%-36s" "$STRx"
    fi

    if [ $INHILITE -eq 1 ]
    then
    STR="$STR  <<"
    else
    STR="$STR    "
    fi
    else
    STR=printf "%40s" " "
    fi
    echo -n "$STR"
    }

    draw_menu()
    {
    TOPx=$1
    shift

    HILITE=$1
    shift

    while [ $TOPx -gt 0 ]
    do
    shift
    TOPx=$(($TOPx-1))
    done

    Y=1
    lcd_cls

    if [ $HILITE -eq 1 ]
    then
    STR1=format_line "$1" 1
    STR2=format_line "$2" 0
    else
    STR1=format_line "$1" 0
    STR2=format_line "$2" 1
    fi

    echo -n "${STR1}${STR2}" > $DEV
    }

    lcd_menu()
    {
    DEF=1
    HILITE=1
    TOP=0
    NUM=$#

    MENUSTR=
    while [ -n "$1" ]
    do
    MENUSTR="$MENUSTR "$1""
    shift
    done

    while [ 1 ]
    do
    eval draw_menu $TOP $HILITE $MENUSTR

    KEY=/bin/scorpio_readkey -1
    case $KEY in
    right)
    if [ $DEF -gt 1 ]
    then
    DEF=$(($DEF-1))
    if [ $DEF -le $TOP ]
    then
    TOP=$(($TOP-1))
    fi
    fi
    HILITE=1
    ;;

    push)
    break
    ;;

    left)
    if [ $DEF -lt $NUM ]
    then
    DEF=$(($DEF+1))
    if [ $HILITE -eq 2 ]
    then
    TOP=$(($TOP+1))
    fi
    fi
    HILITE=2
    ;;
    esac
    done
    echo $DEF
    }

    lcd_cls()
    {
    STR=printf "%80s" " "
    echo -n "$STR" > $DEV
    }

    lcd_msg()
    {
    msg=echo "$1" | cut -b1-4
    if [ ${#LASTSTR} -gt 74 ]
    then
    LASTSTR=echo -n $LASTSTR | cut -b1-74
    STR="$LASTSTR[$msg]"
    else
    N=$((80 - ${#LASTSTR} - 6))
    STR=printf "$LASTSTR%${N}s[$msg]" " "
    fi
    echo -n "$STR" > $DEV
    }

    lcd_ok()
    {
    lcd_msg " OK "
    }

    lcd_fail()
    {
    printf "\a"
    lcd_msg "FAIL"
    }

    lcd_wait()
    {
    lcd_msg "WAIT"
    }
    –-------------------------------
    Confirm_restore.orig script

    #!/bin/sh

    ###############################

    Confirm Restore

    ###############################

    if [ -f "/etc/hardware/current/lcd_functions" ]
    then
      . /etc/hardware/current/lcd_functions
    fi

    if [ -f "/etc/product.spec" ]
    then
      . /etc/product.spec
    fi

    if grep -q "LGVSAVE" /proc/cmdline ; then
      /etc/init.d/last_good_version_save
      reboot
    fi

    if grep -q "LGVRESTORE" /proc/cmdline ; then
      /etc/init.d/last_good_version_restore
      reboot
    fi

    LGVAVAIL=ls /rescue/LGV* 2>/dev/null | grep -q LGV && echo YES

    confirmation() {
      # Shows a Proceed prompt,
      # Args: 1 (Yes - Default then No),
      #      2 (No  - Default then Yes),
      #      Others: 2 Assumed
      # Returns: TRUE (0) if Default is selected, else FALSE (1)
      OPTION=$1
      DEFAULT="Proceed?                        "
      OTHERLN="                                "
      if [ "$OPTION" = "1" ] ; then
        DEFAULT="${DEFAULT}Yes"
        OTHERLN="${OTHERLN} No"
      else
        DEFAULT="${DEFAULT} No"
        OTHERLN="${OTHERLN}Yes"
      fi
      choice=lcd_menu "$DEFAULT" "$OTHERLN"
      if [ "X$choice" = "X1" ] ; then
        return 0
      else
        return 1
      fi
    }

    restore_menu_default() {
      choice=lcd_menu "Cancel Restore" "Restore System"
      if [ "X$choice" = "X1" ] ; then
        operation_cancelled "Restore"
      else
        /etc/init.d/partimage
      fi
    }

    operation_cancelled() {
      lcd_write "$* is Cancelled. Rebooting in 3 seconds."
      sleep 3
      reboot
      exit 1
    }

    restore_menu_full() {
      # Now we check to see if there are extra images that we can
      # install
      if [ -z "$EXTRAIMAGES" ] ; then
        restore_menu_default
      else
        # There are spare items that we can install
        # Check installable items
        IMAGES=""
        for f in $EXTRAIMAGES ; do
          if echo $f | grep -q -e ".000$" ; then
            IMAGES="$IMAGES $f"
          fi
        done
        if [ -z "$IMAGES" ] ; then
          restore_menu_default
        else
          /etc/init.d/partimage $IMAGES
        fi
      fi
    }

    grep -q "noprompt" /proc/cmdline
    if [ "X$?" != "X0" ]
    then
      choice=lcd_menu "Cancel Backup/Restore" "Backup System" "Restore System"
      if [ "X$choice" = "X1" ]
      then
        operation_cancelled "Backup/Restore"
      elif [ "X$choice" = "X2" ] ; then
        lcd_write "Backing up system"
        /etc/init.d/last_good_version_save
        reboot
        exit 1
      elif [ "X$choice" = "X3" ] ; then
        if [ "$LGVAVAIL" = "YES" ] ; then
          choice=lcd_menu "Cancel Restore" "Restore Last Good Version" "Restore System"
          if [ "X$choice" = "X1" ] ; then
            operation_cancelled "Restore"
          elif [ "X$choice" = "X2" ] ; then
            lcd_write "Restoring system"
            /etc/init.d/last_good_version_restore
            reboot
            exit 1
          else
            restore_menu_full
          fi
        else
          restore_menu_full
        fi
      fi
    else
      /etc/init.d/partimage
    fi
    –-------------------------------------

    Next to this all it seems that they load load two specific drivers:

    Mount proc

    if [ ! -f /proc/cpuinfo ]
    then
    mount -t proc none /proc
    fi

    Load USB Driver

    echo Loading USB Driver
    #modprobe usbcore
    #modprobe usb-uhci
    #modprobe input
    #modprobe hid

    Load LCD Driver

    modprobe scorpioLCD
    modprobe led
    #sleep 3

    Load Keyboard Driver

    #modprobe keybdev

    Load Network Driver

    #modprobe e1000

    Load File System Driver

    #modprobe jbd
    #modprobe ext3

    Seems that there are some posibilities.

    Marc


  • Netgate Administrator

    Ah, nice investigative work.  :)
    Its a shame they're not using lcdproc. That way we would know exactly how the driver has to work.
    Interesting that they have separated the lcd and led drivers.

    Interesting that the keydriver appears to be using a serial port. The chip they are using seems to be commonly used as a USB-serial converter so that could make sense. It is recognised as a keyboard by freebsd already though.

    ukbd0: <vendor 0="" 2="" 0x0cb6="" keyboard="" +="" lcd,="" class="" 0,="" rev="" 1.10="" 1.00,="" addr=""> on usbus1</vendor>
    

    I guess a good test would be to just read ukbd0 while operating the knob and see what happens.

    Steve



  • Excellent work guys,
    I almost had given up on getting the LCD to work, but there could be light at the end of the tunnel. :)

    @stephenw10:

    just read ukbd0 while operating the knob and see what happens.

    Could you suggest how to go about that and I’ll give it ago?

    Another good feature of these devices is the speed of the fans are controlled by the CPU temperature, unlike some WatchGuard Firebox boxes. ;)

    On another note, does anybody know how to remap the network interface ports so they match the front panel?

    
    em0: <intel(r) 1000="" pro="" network="" connection="" 7.3.2="">port 0x8f00-0x8f1f mem 0xfd6e0000-0xfd6fffff irq 16 at device 0.0 on pci1
    em0: Using an MSI interrupt
    em0: [FILTER]
    pcib2: <acpi pci-pci="" bridge="">irq 17 at device 28.1 on pci0
    pci2: <acpi pci="" bus="">on pcib2
    em1: <intel(r) 1000="" pro="" network="" connection="" 7.3.2="">port 0x7f00-0x7f1f mem 0xfd2e0000-0xfd2fffff irq 17 at device 0.0 on pci2
    em1: Using an MSI interrupt
    em1: [FILTER]
    pcib3: <acpi pci-pci="" bridge="">irq 18 at device 28.2 on pci0
    pci3: <acpi pci="" bus="">on pcib3
    em2: <intel(r) 1000="" pro="" network="" connection="" 7.3.2="">port 0xdf00-0xdf1f mem 0xfdee0000-0xfdefffff irq 18 at device 0.0 on pci3
    em2: Using an MSI interrupt
    em2: [FILTER]
    pcib4: <acpi pci-pci="" bridge="">irq 19 at device 28.3 on pci0
    pci4: <acpi pci="" bus="">on pcib4
    em3: <intel(r) 1000="" pro="" network="" connection="" 7.3.2="">port 0xcf00-0xcf1f mem 0xfdce0000-0xfdcfffff irq 19 at device 0.0 on pci4
    em3: Using an MSI interrupt
    em3: [FILTER]
    pcib5: <acpi pci-pci="" bridge="">irq 16 at device 28.4 on pci0
    pci5: <acpi pci="" bus="">on pcib5
    em4: <intel(r) 1000="" pro="" network="" connection="" 7.3.2="">port 0xaf00-0xaf1f mem 0xfdae0000-0xfdafffff irq 16 at device 0.0 on pci5
    em4: Using an MSI interrupt
    em4: [FILTER]
    pcib6: <acpi pci-pci="" bridge="">irq 17 at device 28.5 on pci0
    pci6: <acpi pci="" bus="">on pcib6
    em5: <intel(r) 1000="" pro="" network="" connection="" 7.3.2="">port 0x9f00-0x9f1f mem 0xfd8e0000-0xfd8fffff irq 17 at device 0.0 on pci6
    em5: Using an MSI interrupt
    em5: [FILTER]</intel(r)></acpi></acpi></intel(r)></acpi></acpi></intel(r)></acpi></acpi></intel(r)></acpi></acpi></intel(r)></acpi></acpi></intel(r)> 
    

    This is what I am after:-

    ifconfig em5 name em0
    ifconfig em4 name em1
    ifconfig em3 name em2
    ifconfig em2 name em3
    ifconfig em1 name em4
    ifconfig em0 name em5

    Also tried, Create file /etc/rc.conf.local
    ifconfig_em0_name="LAN"
    ifconfig_em1_name="WAN"
    ifconfig_em2_name="DMZ1"
    ifconfig_em3_name="DMZ2"
    ifconfig_em4_name="DMZ3"
    ifconfig_em5_name="DMZ4"

    This doesn’t appear to work unless I’m doing something wrong!

    Thanks in advance for your help.


  • Netgate Administrator

    You can just rename the interfaces in the webgui.
    You can't use normal FreeBSD conf files in pfSense. All the configuration is stored in a single file, config.xml. At boot scripts use that information to write out the various config files, if you manually modify then they will be overwritten the next make you make a change. You can edit the config.xml file directly to make a series of changes but it's open to errors which could cause you all sorts of problems.  ;)

    The keyboard is an interesting question, I've never tried. You appear to have three keyboards detected on that box. In /dev you have kbd0-2. My boxes here have no keyboards. Do you actually have a real keyboard attached? It appears you can get some info from each using the kbdcontrol command:

    kbdcontrol -i < /dev/kbd1
    

    Some useful tests here: http://people.freebsd.org/~yokota/ukbd-howto.txt

    Steve



  • Have just got my hands on a MSA3000 and I'm also interested in getting the LCD/jog wheel running with pfSense.  Sadly my unit arrived without HDD so I don't have a working Windows system to drive the LCD otherwise I could have hooked up a logic analyser to see what messages the driver receives from the PC.

    nanobot do you still have access to the executables and kernel modules?  I wonder if we might be able to decompile the scorpioLCD and led kernel modules and get a bit of information as to how the PC talks to the LCD driver…?


  • Netgate Administrator

    It's very unlikely that the Celestix engineers designed a completely new custom protocol and display for their box. It's probably using common protocols and likely off the shelf components. It may have some custom firmware to drive the control wheel and leds.
    At least some of the hardware appears to be using standard USB-serial converters so the first thing I would try would be to recompile the USB-Serial driver to recognise the USB IDs of the hardware in the box and see if you can talk to it from a terminal or read anything it's sending.

    Steve



  • I agree it's probably nothing too complicated or proprietary.  It enumerates as a USB HID device, the jog wheel sends out key codes when it's rotated or clicked - that's the easy bit!  This is what Ubuntu makes of the device:

    
    Bus 003 Device 002: ID 0cb6:0002 Celestix Networks, Pte., Ltd
    Device Descriptor:
      bLength                18
      bDescriptorType         1
      bcdUSB               1.10
      bDeviceClass            0 (Defined at Interface level)
      bDeviceSubClass         0
      bDeviceProtocol         0
      bMaxPacketSize0         8
      idVendor           0x0cb6 Celestix Networks, Pte., Ltd
      idProduct          0x0002
      bcdDevice            1.00
      iManufacturer           1 CELESTIX NETWORKS
      iProduct                2 KEYBOARD + LCD
      iSerial                 0
      bNumConfigurations      1
      Configuration Descriptor:
        bLength                 9
        bDescriptorType         2
        wTotalLength           34
        bNumInterfaces          1
        bConfigurationValue     1
        iConfiguration          0
        bmAttributes         0x80
          (Bus Powered)
        MaxPower               50mA
        Interface Descriptor:
          bLength                 9
          bDescriptorType         4
          bInterfaceNumber        0
          bAlternateSetting       0
          bNumEndpoints           1
          bInterfaceClass         3 Human Interface Device
          bInterfaceSubClass      1 Boot Interface Subclass
          bInterfaceProtocol      1 Keyboard
          iInterface              0
            HID Device Descriptor:
              bLength                 9
              bDescriptorType        33
              bcdHID               1.00
              bCountryCode            0 Not supported
              bNumDescriptors         1
              bDescriptorType        34 Report
              wDescriptorLength      62
              Report Descriptor: (length is 62)
                Item(Global): Usage Page, data= [ 0x01 ] 1
                                Generic Desktop Controls
                Item(Local ): Usage, data= [ 0x06 ] 6
                                Keyboard
                Item(Main  ): Collection, data= [ 0x01 ] 1
                                Application
                Item(Global): Report ID, data= [ 0x01 ] 1
                Item(Global): Usage Page, data= [ 0x07 ] 7
                                Keyboard
                Item(Local ): Usage Minimum, data= [ 0xe0 ] 224
                                Control Left
                Item(Local ): Usage Maximum, data= [ 0xe7 ] 231
                                GUI Right
                Item(Global): Logical Minimum, data= [ 0x00 ] 0
                Item(Global): Logical Maximum, data= [ 0x01 ] 1
                Item(Global): Report Size, data= [ 0x01 ] 1
                Item(Global): Report Count, data= [ 0x08 ] 8
                Item(Main  ): Input, data= [ 0x02 ] 2
                                Data Variable Absolute No_Wrap Linear
                                Preferred_State No_Null_Position Non_Volatile Bitfield
                Item(Global): Report Size, data= [ 0x08 ] 8
                Item(Global): Report Count, data= [ 0x01 ] 1
                Item(Global): Logical Minimum, data= [ 0x00 ] 0
                Item(Global): Logical Maximum, data= [ 0x68 ] 104
                Item(Global): Usage Page, data= [ 0x07 ] 7
                                Keyboard
                Item(Local ): Usage Minimum, data= [ 0x00 ] 0
                                No Event
                Item(Local ): Usage Maximum, data= [ 0x68 ] 104
                                F13
                Item(Main  ): Input, data= [ 0x00 ] 0
                                Data Array Absolute No_Wrap Linear
                                Preferred_State No_Null_Position Non_Volatile Bitfield
                Item(Main  ): End Collection, data=none
                Item(Global): Usage Page, data= [ 0x14 ] 20
                                Alphanumeric Display
                Item(Local ): Usage, data= [ 0x01 ] 1
                                Alphanumeric Display
                Item(Main  ): Collection, data= [ 0x01 ] 1
                                Application
                Item(Global): Report ID, data= [ 0x02 ] 2
                Item(Local ): Usage, data= [ 0x2c ] 44
                                Display Data
                Item(Global): Logical Minimum, data= [ 0x80 ] 128
                Item(Global): Logical Maximum, data= [ 0x7f ] 127
                Item(Global): Report Size, data= [ 0x08 ] 8
                Item(Global): Report Count, data= [ 0x58 ] 88
                Item(Main  ): Output, data= [ 0x02 ] 2
                                Data Variable Absolute No_Wrap Linear
                                Preferred_State No_Null_Position Non_Volatile Bitfield
                Item(Main  ): End Collection, data=none
          Endpoint Descriptor:
            bLength                 7
            bDescriptorType         5
            bEndpointAddress     0x81  EP 1 IN
            bmAttributes            3
              Transfer Type            Interrupt
              Synch Type               None
              Usage Type               Data
            wMaxPacketSize     0x0008  1x 8 bytes
            bInterval              10
    Device Status:     0x0000
      (Bus Powered)
    
    

    There seem to be very few LCDs using a Cypress driver, I saw that the IOWarrior did and that's supported within LCDProc, I tried recompiling it to match the USB VID:PID of the Celestix device but it did not work.  I guess that would have been too easy!

    So I'm at a little bit of a loss at the moment, I haven't done any USB driver development before.  I can't imagine the driver is that complex, but at the same time I don't know how to send character / raw data to a USB HID device.  I've started looking at pyusb but it's very low level stuff…


  • Netgate Administrator

    What I would do I were trying to design this…..
    Use a standard keyboard controller IC for the jog wheel and LEDs (num,caps and scroll lock).
    Use a standard USB-serial converter and connect that to a serial LCD.

    You have two USB devices there yes? One is detected as a keyboard already. There are programs in existence that use keyboard LEDs as indicators, it must be possible to try setting them manually. That should be an easy enough test.
    The other USB device seen as ugen1.2 in the first posts here is probably the serial converter. I would try to recompile the cypress driver to recognise the USB vendor and product IDs used by it. If that works then try various LCDproc settings to talk to the LCD across it.

    Steve

    Edit: I can't find a FreeBSD equivalent but in Ubuntu you can try using the setleds command.



  • Actually it's just a single USB device (combined keyboard and LCD).  The problem is there doesn't seem to be any standard way to interface with displays over HID, so without a working system to sniff it is next to impossible to reverse engineer the protocol they have used on the cypress microprocessor.

    Probably the easiest solution, certainly time wise, would be to replace the microprocessor with something LCDproc does support, such as an FTDI FT232 chip.  This would probably mean losing the jog wheel, though there should be a pin spare for the activity LED at least…



  • On another subject I've been tinkering with different CPUs as the P4 3GHz mine came with by standard isn't the most energy efficient chip, and I know that some of the higher spec MSA boxes come with core 2 duo chips (E6420 I believe).  I've tested the following:

    Core2duo E6420 SLA4T (2.13GHz, 1066 FSB, 4M) - boots but unstable
    Core2duo E6320 SLA4U (1.86MHz, 1066 FSB, 4M) - boots but unstable
    Core2duo E4400 SLA98 (2.00GHz, 800 FSB, 2M) - boots, stable, BIOS reports incorrect speed?

    The E4400 gets reported at the BIOS as 50x10 = 500MHz!  This is also reported in the OS I'm using to test (Ubuntu) but performance suggests it's actually running at the 2GHz.  Doesn't look like it will be possible to run powerd in this sort of state however.  You can set the FSB in the BIOS but this seems to get divided down by 4 for some reason with the E4400.

    Not quite sure why the E6x20 1066 FSB chips aren't stable.  It does take a lot to make them crash, I've been running memtest, mprime torture tests but the 'stress' command seems to reliably kill them given a few cycles.  When they crash the system just halts, no input or output but the display remains frozen, very odd.  The E4400 has been running with both mprime and the odd stress command for several hours now stable and has topped out at a core temp of 66c.  All were tested with known good 2x 1Gb and 2x512Mb PC5300.

    The stress command I have been using is

    stress --cpu 8 --io 4 --vm 2 --vm-bytes 128M --timeout 10s
    

    All these oddities suggest to me a BIOS issue, though I cannot find an update for it (perhaps unsurprisingly, it being a custom motherboard).  If time permits I may try to extract the existing BIOS and see if there is anything that can be unlocked settings wise.



  • I found the datasheets for the display they indicates that the module is using a "NT3881 or equivalent" display driver chip.  on the LCDproc hardware page it indicates that that controller is compatible and supported under the hd44780.

    http://media.digikey.com/pdf/Data Sheets/Varitronix PDFs/MDLS40263-01 Specification.pdf
    http://lcdproc.omnipotent.net/hardware.php3
    http://media.digikey.com/pdf/Data Sheets/Varitronix PDFs/MDL(S)40263.pdf
    http://media.digikey.com/pdf/Data Sheets/Varitronix PDFs/Varitronix LCD Initialization Instructions.pdf


  • Netgate Administrator

    Controlling the LCD itself is probably not a problem, there are drivers already in LCDproc for various hd44780 modes. The problem is controlling whatever it is connected to. It appears as a single USB device that does the leds and control wheel as well as the LCD.

    Steve



  • Following…



  • Here's the pinout of the LCD module:

    
    +--------------------+    PIN   FUNCTION                                            
    | 02  04  06  08  10 |   +---+ +--------+                                           
    |                    |     01   USB 5v                                              
    | 01  03  05  07  09 |     02   USB D-                                              
    +--------|  |--------+     03   USB D+                                              
                               04   USB GND                                             
       Connector on PCB        05   LED Green (Power)                                   
                               06   LED Red (Fault)                                     
                               07   LED Ambert (Disk)                                   
              ++               08   System Power (short to GND to boot machine)         
    +--------------------+     09   3v                                                  
    | 01  03  05  07  09 |     10   State detect ("System On" -> "System Ready")        
    |                    |                                                              
    | 02  04  06  08  10 |     USB is only enabled when "Ready" state is achieved       
    +--------------------+     When module is outside of system, short pin 10 to any LED
                               to force "Ready" state and USB communication             
      Connector on cable                                                                
    
    


  • If you want to replace the Cavium Nitrox miniPCI card you could go by using a
    Soekris vpn1411 miniPCI card that is supported by pfSense.



  • I have a couple of Celestix boxes with intact stock software. Will be posting USB captures soon, stay tuned…



  • @pkirkovsky:

    I have a couple of Celestix boxes with intact stock software. Will be posting USB captures soon, stay tuned…

    How's this going? I received my MSA 4000 today, put pfSense on it, would like to get the front panel running and help where possible. ;- )
    Also noticed a red LED flashes above the exclamation symbol, does this happen on yours too?



  • I have one of these boxes as well as 2 x RSA Securid boxes (Celestix Scorpio) with the same LCD/jog wheel combo.  It would be nice to have it all working nicely with lcdproc/pfsense.  Nice work so far.  : )

    Following.




  • Netgate Administrator

    Looks like a binary Linux driver they're using. Not much use in pfSense/FreeBSD.

    Steve



  • Ok.  I feel like I've seen a (possibly Windows) driver for this before in searching around the web when I first got the box.

    I think that I still have an in-tact system drive from the original appliance ,and I was able to find the driver details for the display/wheel in Windows, then research it online to find more information.  I didn't know what to do with it once I found it, so I think I've long since deleted whatever it was I found.  But if I found it once, I might possibly be able to find it again.

    I'll have to dig up the drive that has the original Win2K3 install on it and see if I can find the driver info.  If I can find the .inf file would that be of any help?



  • The device is listed in Win2K3 as a Jungo lcd.  The driver is windrvr6.sys.  Googlefu: http://www.jungo.com/st/products/windriver/

    Not sure if that helps or not.  Let me know if I can provide anything else.



  • Oops/

    Celestix S-X MSA 4000 Windows LCD driver info:



    Manufacturer: Varitronix
    Model: MDLS-40263-LV-B-LED
    Product: LCD Character Display Modules
    Character Count x Line: 40 x 2



  • I been doing some research on the same hardware that seems to be used by celestix all across it's product line.

    For now I've been able to fetch some characteristics about the device:

    • It's a composite USB HID device (Keyboard + Alphanumeric LCD pages)
    • It will output 8 fields (1 bit each) when a keyboard event occurs.
    • The input for the LCD is a 88 byte array probably some 8 byte control preamble followed to up to 80 characters (40x2 chars)

    HID table for those interested:

    
    USAGE_PAGE (Generic Desktop Controls)
    USAGE (Keyboard)
    COLLECTION (Application)
      REPORT_ID(1)
      USAGE_PAGE (Keyboard)
      USAGE_MINIMUM(Control Left)
      USAGE_MAXIMUM(GUI Right)
      LOGICAL_MINIMUM(0)
      LOGICAL_MAXIMUM(1)
      REPORT_SIZE(1)
      REPORT_COUNT(8)
      INPUT(Data, Var, Absolute, No Wrap, Linear, Preferred_State, No_Null_Position,Non_Volatile, Bitfield)
      REPORT_SIZE(8)
      REPORT_COUNT(1)
      LOGICAL_MINIMUM(0)
      LOGICAL_MAXIMUM(104)
      USAGE_PAGE (Keyboard)
      USAGE_MINIMUM(0)
      USAGE_MAXIMUM(104)
      INPUT(Data, Array, Absolute, No Wrap, Linear, Preferred_State, No_Null_Position,Non_Volatile, Bitfield)
    END COLLECTION
    USAGE_PAGE (Alphanumeric Display)
    USAGE (Alphanumeric Display)
    COLLECTION (Application)
      REPORT_ID(2)
      USAGE(Display Data)
      LOGICAL_MINIMUM(128)
      LOGICAL_MAXIMUM(127)
      REPORT_SIZE(8)
      REPORT_COUNT(88)
      OUTPUT(Data, Var, Absolute, No Wrap, Linear, Preferred_State, No_Null_Position,Non_Volatile, Bitfield)
    END COLLECTION
    
    

    If any of you have access to binaries (either windows or linux) please let me know because they can be very helpful in decoding the command schema for the LCD operation.



  • Got it working!




  • The alert LED is GPIO. Here's the linux source. Please share back if anyone can get it to work on FreeBSD.

    #include <stdio.h>#include <stdlib.h>#include <sys io.h="">/* for outb() and inb() */

    #define IOADDR 0x50e

    void usage()
    {
        printf("ngled [0|1|2]\n");
        printf("            0 : off  \n");
        printf("            1 : on  \n");
        printf("            2 : blink  \n");
        printf("\nShows status if no command is passed.\n");
        exit(1);
    }

    int main(int argc, char **argv)
    {
      if (iopl(3) < 0) {
            printf("iopl fail\n");
            return;
    }

    if (argc < 2)
    {
      if ( inb(0x51a) == 0x84 ) printf("2\n");
      else if ( inb(IOADDR) == 0x7b ) printf("0\n");
      else printf("1\n");
      return;
    } else if ( argc > 2 ) usage();

    switch (*argv[1])
    {
      case '0':
    /fprintf(stderr, "OFF!!");/
    outb(inb(0x50e)&0x7f,IOADDR);
    outb(0x4,0x51a);
      break;

    case '1':
    /fprintf(stderr, "ON!!");/
    outb(inb(0x51a)&0x7f,0x51a);
    outb(inb(0x50e)|0x80,IOADDR);
    break;
      case '2':
    outb(inb(0x50e)&0x7f,IOADDR);
    outb(inb(0x51a)|0x80,0x51a);
    break;
      default:
    usage();
    }

    return 0;
    }</sys></stdlib.h></stdio.h>



  • @HammyHavoc:

    @pkirkovsky:

    I have a couple of Celestix boxes with intact stock software. Will be posting USB captures soon, stay tuned…

    How's this going? I received my MSA 4000 today, put pfSense on it, would like to get the front panel running and help where possible. ;- )

    Sorry this took so long!

    Here is a ZIP file containing captures of LCD and jogdial activity:
    https://kirkovsky.com/junkbin/celestix.zip

    This activity was captured on the stock Windows system that comes with these boxes. Included in the ZIP is USBLyzer (Windows only AFAIK) format, HTML & CSV export from USBLyzer, and standard pcap USB capture format (should be Wireshark compatible). Hope this helps!

    @HammyHavoc:

    Also noticed a red LED flashes above the exclamation symbol, does this happen on yours too?

    Yes, this happens on mine too. It looks like there's some kind of watchdog function that allows the OS to tell the LCD module not to flash that LED, but if no signal is being sent it flashes constantly.



  • @yeyus:

    If any of you have access to binaries (either windows or linux) please let me know because they can be very helpful in decoding the command schema for the LCD operation.

    I have default/stock system images for both Windows and Linux (recovery partition) of the ScorpioX machines (the Celestix MSA/WSA/etc and certain RSA-branded boxes all share the same base platform).

    The Linux recovery partition has some control binaries and kernel modules (a module for the LCD + jogdial and a module for the alert LED). The Windows side has basically the same setup, but the display/jogdial/LED are all rolled into one driver binary.

    I don't want to widely distribute these due to copyright concerns. PM me for further details.



  • @yeyus:

    Got it working!

    Was this Linux or FreeBSD?

    EDIT: Must be Linux; hidtest-hidraw appears to be a https://github.com/signal11/hidapi utility.  I'm curious what the equivalent FreeBSD approach is - when I looked at LCDProc, the [pfSense] config asked a lot of questions I didn't know!



  • @twisted2k3:

    The alert LED is GPIO. Here's the linux source….

    @stephenw10 - your WGXepc program set GPIO values for the arm/disarm LED on the WG FB boxes, didn't it?  (I don't know much about this….)  Could the program be used in similar way to probe the GPIO for the LCD/Keyboard controls of this device?


 

© Copyright 2002 - 2018 Rubicon Communications, LLC | Privacy Policy