![Jakub Schmidtke](/assets/img/avatar_default.png)
Driver for the OLED tiny display on some Asus laptops. From: Jakub Schmidtke <sjakub@gmail.com> Cc: Cyrill Gorcunov <gorcunov@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
157 lines
6.4 KiB
Plaintext
157 lines
6.4 KiB
Plaintext
|
|
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)
|
|
|