
    Driver for Asus OLED display present in some Asus laptops.

    The code of this driver is based on 'asusoled' program taken from
    https://launchpad.net/asusoled/. I just wanted to have a simple
    kernel driver for controlling this device, but I didn't know how
    to do that. Now I know ;) Also, that program can not be used
    with usbhid loaded, which means no USB mouse/keyboard while
    controlling OLED display :(

    It has been tested on Asus G1 and didn't cause any problems,
    but I don't guarantee that it won't do anything wrong :)

    It can (and probably does) have errors. It is usable
    in my case, and I hope others will find it useful too!

*******

Building the module

   To build the module you need kernel 2.6 include files and some C compiler.

   Just run:
   make
   make install (as a root)

   It will build (hopefully) the module and install it in
   /lib/modules/'uname -r'/extra/asus_oled.ko.

   To load it just use:
   modprobe asus_oled

   You can check if it has detected your OLED display by looking into dmesg output.
   There should be something like this:
   asus-oled 2-7:1.0: Attached Asus OLED device

   If it doesn't find your display, you can try removing usbhid module.
   If you add asus_oled into the list of modules loaded during system boot
   before usbhid, it will work even when usbhid is present.

   If it still doesn't detect your hardware, check lsusb output.
   There should be similar line:
   Bus 002 Device 005: ID 0b05:1726 ASUSTek Computer, Inc.

   If you don't see any lines with '0b05:1726' it means that you have different
   type of hardware that is not detected (it may or may not work, but the driver
   knows only '0b05:1726' device).

*******

Configuration

   There is only one option: start_off.
   You can use it by: 'modprobe asus_oled start_off=1', or by adding this
   line to /etc/modprobe.conf:
   options asus_oled start_off=1

   With this option provided, asus_oled driver will switch off the display
   when it is detected and attached. It is nice feature to just switch off the 'ASUS'
   logo. If you don't use the display, it is probably the good idea to switch it off,
   to protect OLEDs from "wearing off".

*******

Usage

   This module can be controlled with two special files:
   /sys/class/asus_oled/oled_N/enabled
   /sys/class/asus_oled/oled_N/picture

   (N is the device number, the first, and probably the only, has number 1,
    so it is /sys/class/asus_oled/oled_1/enabled
    and /sys/class/asus_oled/oled_1/picture)

   'enabled' files is for reading and writing, 'picture' is writeable only.

   You can write 0 or 1 to 'enabled' file, which will switch
   on and off the display. Reading from this file will tell you the last
   status set, either 0 or 1. By default it is 1, so if the device was set to 'off',
   and the computer was rebooted without power-off, this file will contain wrong
   value - because the device is off, but hasn't been disabled this time and is
   assumed to be on...

   To 'picture' file you write pictures to be displayed by the OLED device.
   The format of the file:
   <M:WxH>
   00001110010111000
   00010101010101010
   ....

   First line is a configuration parameter. Meaning of fields in <M:WxH>:
   M - picture mode. It can be either 's' for static pictures,
       'r' for rolling pictures, and 'f' for flashing pictures.
   W - width of the picture. May be between 1 and 1792
   H - height of the picture. May be between 1 and 32

   For example <s:128x32> means static picture, 128 pixels long and 32 pixels high.

   The physical size of the display is 128x32 pixels. Static and flashing pictures
   can't be larger than that (actually they can, but only part of them will be displayed ;) )

   If the picture is smaller than 128x32 it will be centered. Rolling pictures wider than
   128 pixels will be centered too, unless their width = n*128. Vertically they will be
   centered just like static pictures, if their height is smaller than 32.

   Flashing pictures will be centered horizontally if their width < 128, but they were
   centered vertically in a different way. If their height < 16, they will be centered
   in the upper half of the display (rows 0-15). This is because only the first half
   of flashing pictures is used for flashing. When the picture with heigh = 32 is
   displayed in flashing mode, its upper 16 rows will be flashing in the upper half
   of the display, and the lower half will be empty. After few seconds upper part will
   stop flashing (but that part of the picture will remain there), and the lower
   half of the display will start displayin the lower half of the picture
   in rolling mode, unless it is empty, or the picture was small enough to fit in
   upper part. It is not mine idea, this is just the way Asus' display work ;)
   So if you need just flashing, use at most 128x16 picture. If you need flashing and
   rolling, use whole size of the display.

   Lines following the first, configuration, line are picture data. Each '1' means
   that the pixel is lit, and '0' means that it is not. You can also use '#' as ON,
   and ' ' (space) as OFF. Empty lines and all other characters are ignored.

   It is possible to write everything in one line <M:WxH>01010101010101010...,
   and W*H characters will be used. If there is not enough characters, nothing will be
   displayed. However, the 'line mode' is easier to read (and write), and it also
   lets to omit parts of data. Whenever End-Of-Line character is found, but
   the line is not W characters long, it is assumed that all missing characters
   are equal to the last character in the line.

   Following line represents '0', '1' and a lots of '0's, dependng on the width of the picture
   provided in configuration data:
   010

   So if you need empty line, it is sufficient to write line with only one '0' in it.
   The same works with '1' (or ' ' and '#').

   If there are too many data in the file, they will be ignored. If you are not sure
   how many characters you are missing, you can add few lines with one zero in each of them.

   There are some example pictures in .txt format, that can be used as follows:
   cat foo.txt > /sys/class/asus_oled/oled_1/picture

   If the display is switched off you also need to run:
   echo 1 > /sys/class/asus_oled/oled_1/enabled
   To switch it off, just use:
   echo 0 > /sys/class/asus_oled/oled_1/enabled


*******

   For any additional info please have a look at http://lapsus.berlios.de/asus_oled.html



   Jakub Schmidtke (sjakub@gmail.com)

