# The ula200 Driver

## General

The ULA-200 (short for German USB-LCD-Ansteuerung), manufactured and sold by ELV, is a small board that connects a HD44780-compatible display to the computer using the USB interface. Additionally it provides 6 digital inputs that can be used for keys.

The `ula200` driver controls this board supporting the features:

- display on a single-controller HD44780 display

- standard icons (heart, checkbox)

- backlight control

- input buttons

- no horizontal or vertical bars

## Requirements

The driver uses `libftdi`, which again uses `libusb` for communication with the device, so no kernel driver is needed on Linux, and the driver can be used on other operating systems as well.

When using a `libusb` based driver like `IOWarrior`, LCDd needs to be started as root.

On Linux, you have to take care that the `ftdi_sio.ko` kernel module doesn't claim the ELV device. If you didn't change the IDs in the kernel driver (`ftdi_sio.c`), this should not matter.

## Known problems

Sometimes the display hangs (the ACK response is not received) on shutdown. Reconnect the display in that case. Please do the same if it hangs while starting up. The latter only happens if it was not the first time LCDd talked to the display.

## Implementation note

(by the driver's author Bernhard Walle)

The ULA-200 talks a text protocol which allows to display text using a high-level language, i.e. `STX` `s` `len` `char0` `char1` ... `ETX`. It also allows low-level register access to the HD44780. So in theory, it would be possible to write a connection type for the `hd44780` driver and let the `hd44780` core do the rest. I tried this. It was slow and didn't work with user-specific characters (the hd44780 frequently changes this characters which seems to confuse the microcontroller, at least I cannot explain why it didn't work, there was garbage).

So I wrote a separate driver, the `ula200`, which uses the high-level language and should work for displays with all sizes. I only tested 20x4, so maybe for other sizes the positioning code may be adapted.

As I mentioned, there were problems with frequently changing the user-definable characters. I also tried to implement bar code in the `ula200` driver with similar effects. I gave it up because I don't need it personally and it can be done later. However, standard icons are implemented. The user-definable characters are set in startup and are not changed. This works like a charm. It is not possible to use character 0 with the high-level language (or at least it isn't documented how to escape it). It could be done with hd44780 code, but I replaced the character with a standard character which looks good.

## Configuration in LCDd.conf

### [ula200]

`Size` = ¶meters.size;

- Select the LCD size [default: `20x4`]

`KeyMap_A` = ``KEY``

`KeyMap_B` = ``KEY``

`KeyMap_C` = ``KEY``

`KeyMap_D` = ``KEY``

`KeyMap_E` = ``KEY``

`KeyMap_F` = ``KEY``

- If you have a non standard keypad you can associate any keystrings to keys. There are 6 input keys in the ULA-200 hardware that generate characters from '`A`' to '`F`'. Legal values for `KEY` are `Up`, `Down`, `Left`, `Right`, `Enter` and `Escape`.

  The following table lists the built-in default mapping hardcoded in the driver.

  KeyMap_A | `Up`
  KeyMap_B | `Down`
  KeyMap_C | `Left`
  KeyMap_D | `Right`
  KeyMap_E | `Enter`
  KeyMap_F | `Escape`

  You may leave it unchanged if you have a standard keypad. You can change it if you want to report other keystrings or have a non-standard keypad.