Toshiba supports..

SuSE Linux on the Toshiba Libretto 70CT

Author: sjb (Steve Brown) -
Date: 29th April 2002
See also: Linux on Laptops

What is a Toshiba Libretto 70CT?

Assuming that you've not stumbled across this page by accident, you probably already know that the Libretto is a fully functional PC built into a case measuring 210mm x 115mm x 34mm and, as such, is probably one of the smallest PCs you can find. The 70CT was the top-of-the-range 2nd generation Libretto which, I believe, was discontinued at the end of 1997. Being so small, the Libretto doesn't include a built-in floppy or CD drive, although an original floppy drive is available which connects via a PCMCIA adaptor.

I've had my 70CT for a while and it came with Windows 95 on it, and I upgraded various parts of the OS to keep the machine relatively current. However, when I bought my Nino and other laptops the Libretto sat around for a long time .. unused, unloved and uncharged. When I eventually decided to put Linux onto the Libretto I found that the main battery was in a bad way and that the CMOS battery was completely dead. I was able to buy a replacement CMOS battery from MDS Batteries (10.25 GBP) and a replacement Li-Ion battery from Dabs (45.00 GBP). I also bought a 4.8GB HDD from Eurosimm (50.00 GBP).

CPU 120MHz Intel Pentium MMX
RAM 16 / 32MB (mine is 32MB)
HDD 1.6GB (IBM DDLA21620)
Graphics card Chips & technologies CT-65550 1MB
Display 6.1" TFT
Audio Yamaha OPL3 SA2
PCMCIA 1 x type II (2 x type II with port replicator)
OS Windows 95?
Linux SuSE 7.3 Professional upgrade
Libretto 70CT

OK .. so if you're searching the web looking for instructions on how to install Linux onto a Libretto you'll have noticed that it can be quite tricky ;-) I won't cover the various problems or methods of installing Linux described on other pages (see for examples), but I will describe how I put Linux onto my Libretto which bypasses all the messing around.

My basic solution was to use my Toshiba Satellite as a "host" for the Libretto hard disk.

The Satellite has everything you need to install Linux simply, so all I did was remove the HDD from the Satellite, put the Libretto HDD in instead, installed Linux on it from the DVD, and then put the HDD back into the Libretto. Which sounds really simple ... because it is! Hardware wise, you just need to be able to operate a screwdriver ;-)

The Libretto HDD is an IBM DDLA21620 (I'm actually using an IBM DBCA204860 disc in my Libretto, which has a 4.8GB capacity) which turned out to have very slightly different dimensions to the HDD in the Satellite. The Satellite disc is screwed into a small tray, which doesn't exactly fit the Libretto HDD, but it's close enough so that you can swap the drives and put the assembly back into the Satellite.

There is a problem putting SuSE 7.3 onto the 1.6GB drive .. well, not a problem with SuSE exactly, but a problem of disc capacity in general. Opting to install KDE required more disk space than was available, so I opted to do a minimal graphical install and use the GNU Window Manager instead. I subsequently upgraded the disc to a 4.8GB drive which had enough space to install KDE.

During the install I opted to setup X Windows. YaST2 configured the frame buffer device (fbdev) and I chose a resolution of 640 x 480 x 24bpp. After the install, with the HDD back in the Libretto, X started and ran perfectly using the frame buffer. However, I used SaX2 to select the Chips & Technologies driver for the CT65550 graphics chip. My XF86Config appears below.

I skipped the hardware detection stage of the YaST2 setup because I didn't want it to autodetect hardware in the Satellite that wasn't present in the Libretto. After replacing the HDD in the Libretto I configured my NIC, modem and sound card.

NIC: I use a PCMCIA NIC (D-Link DE-660) with the Libretto which works perfectly. I used YaST2 to configure the cards network settings and cardmgr loaded the driver without any problems.

Modem: Again, I use a PCMCIA modem and, again, this was loaded flawlessly by cardmgr. Again, I used YaST2 to configure the card. I use pppd and chat to dial into my ISP with no problems.

Sound: I used YaST2 to install ALSA (Advanced Linux Sound Architecture) and ran alsaconf to configure the sound "card". alsaconf tries to probe the PCI bus (which doesn't exist on the Libretto), and then gives up with that approach and probes for "legacy ISA" devices. You'll see a list of cards to probe for, de-select everything except "Yamaha OPL3-SA3", since that's what is in the Libretto and let alsaconf do the rest. My /etc/sound.conf is below, as is the relavent section from my /etc/modules.conf. It seems to work fine ;-)

IrDA: I messed around with this for a long time, so I can't actually remember every step I took to get this working. Sorry. But I think this is fairly close. Use YaST2 to install the IrDA utilities, su to root, then try this

rcirda start

and if that doesn't work (use irdadump to check), try doing everything by hand.

To load the IrDA modules ..

insmod irda
insmod irtty
insmod ircomm
insmod ircomm-tty

verify that the modules are loaded with 'lsmod'..

ircomm-tty             18512   0  (autoclean)
ircomm                  6624   0  [ircomm-tty]
irtty                   5328   2
irda                   79200   1  [ircomm-tty ircomm irtty]

then attach the IrDA stack to your serial port ..

irattach /dev/ttyS1 -s 1

use 'irdadump' to verify that something's happening ..

05:55:17.133947 xid:cmd 453038af > ffffffff S=6 s=4 (14)
05:55:17.223936 xid:cmd 453038af > ffffffff S=6 s=5 (14)
05:55:17.313934 xid:cmd 453038af > ffffffff S=6 s=* libretto hint=0400 [ Computer ] (24)

That's the Libretto in "discovery" mode, broadcasting packets to anything that will listen.

Activating the IR port on my Nokia 6210 and aligning the two devices gives me

05:55:44.313914 xid:rsp 453038af < 702d0000 S=6 s=5 Nokia 
6210 hint=b125 [ PnP Modem Fax Telephony IrCOMM IrOBEX ] (27)

and doing the same with my Nino returns

20:35:34.373598 xid:rsp fe2f541f < 00000ce1 S=6 s=4 Palm-size_PC hint=8204 [ PDA/Palmtop IrCOMM ] (29)

.. and that's it.

You should now be able to communicate with your IrDA enabled items through /dev/comm1. As an example, here are the two files that I use to let me dial my ISP using the Nokia over infrared.

libretto:/home/ottaky # more /etc/ppp/peers/demongsmir
/dev/ircomm1 9600 crtscts

connect '/usr/sbin/chat -v -f /etc/ppp/chat-demongsm'
mru 1490
mtu 1490

libretto:/home/ottaky # more /etc/ppp/chat-demongsm
"" "ATZ"
"" "\p\p\p\p\pATZ"
"OK" "\p\p\p\p\pATDT08452121666"
"login:" "[my login name here]"

"ssword:" "[my password here]"
"tocol:" "ppp"

(I issue the two atz commands because the phone doesn't always respond quickly enough for the script)

By following the instructions on I was able to set up an IrDA connection with my Nino, which is kinda neat, but ultimately not very useful ;-)

Tweaks & Upgrades

I've upgraded the original 1.6GB disc drive to a 4.8GB device and added the following line

hdparm -c1 -m16 -u1 -k1 /dev/hda

to /etc/init.d/boot.local. (Read the hdparm manual page carefully! The values above are for my new HDD, and are unlikely to be any use for your Libretto unless you have the same disc drive as myself).

My machine has 32MB of RAM and a high capacity Li-Ion battery pack.

I have an extended port replicator which provides a second Type II PCMCIA slot, serial and parallel ports and VGA out.

Tips, Oddities & Gotchas

The Libretto hibernates by writing the contents of its memory to the HDD. Don't let it do this! Theoretically you could create a partition whilst installing Linux to handle this, but (to be honest) I'm not entirely sure how big it would need to be (physical memory + VGA memory + 1MB = 34MB?), or even where to put it. And even if I did know I guess that info would be specific to the memory and HDD in my machine. If you want to play with this option, try a Google search for "libretto hibernate linux" or something.

Let's face it .. the Libretto is not fast. In fact, using a 32MB, 120MHz based machine with KDE makes you really appreciate your 1.5GHz desktop machine with half a gig of RAM. In fact, KDE is achingly slow, so slow that I avoid using it. The other window managers supplied by SuSE are much faster, albeit with less functionality.

I scratched my head for a while trying to figure out how to set the correct date and time for the BIOS clock. There's no way to do this using the Libretto BIOS, but you can use hwclock from a terminal to do this. (Try "man hwclock" for details).

The Libretto has a single speaker .. use alsamixer to set "mono" to 100%. Unless you're using stereo headphones ;-)

SuSE (and most other distros, presumably) comes with a neat little package called "libapm" which gives you command line access to the Libretto's power management settings:

linux:/home/ottaky # libapm

Power Management for Libretto V1.0beta5
|   0) Power-up Mode      : Boot                            |
|   1) Standby Time       : ****** (5 min)                  |
|   2) System Auto Off    : Disabled                        |
|   3) Panel Power On/Off : ****** (Disabled)               |
|   4) Alarm Power On     : Disabled                        |
|   5) LCD Power          : 3                               |
|   6) Volume             : mid                             |
|   7) Off (Suspend/Hiber): Unknown                         |

You can also set the values, if you like, which is handy.


I have a Philips Nino 510 (a Pocket PC device running Windows CE) that takes Compact Flash memory cards, and a Sony DSC-F505 Cybershot Digital Camera which takes the Sony Memory Sticks. I have PCMCIA adpators for both types of memory. The CF card was originally formatted by Windows CE and is a 32MB device manufactured by Hitachi as follows ..

Compact Flash 32MB
/sbin/cardctl ident
Socket 0:
product info: "HITACHI", "FLASH", "2.0"
manfid: 0x0007, 0x0000
function: 4 (fixed disk)
/sbin/cardctl config
Socket 0:
Vcc 3.3V Vpp1 0.0V Vpp2 0.0V
interface type is "memory and I/O"
irq 9 [exclusive] [level]
function 0:
config base 0x0200
option 0x41 status 0x00 pin 0x00 copy 0x00
io 0x0100-0x010f [auto]

The card can be mounted manually using

mount -v -t msdos /dev/hdb1 /memstick

The Sony Memory Sticks are 4MB and 32MB ..

Memory Sticks 4MB 32MB
/sbin/cardctl ident
Socket 0:
product info: "SONY", "MEMORYSTICK( 4M)", "1.0"
manfid: 0x00f1, 0x0000
function: 4 (fixed disk)
Socket 0:
product info: "SONY", "MEMORYSTICK( 32M)", "1.0"
manfid: 0x00f1, 0x0000
function: 4 (fixed disk)
/sbin/cardctl config
Socket 0:
Vcc 3.3V Vpp1 0.0V Vpp2 0.0V
interface type is "memory and I/O"
irq 9 [exclusive] [level]
function 0:
config base 0x0200
option 0x41 status 0x00 pin 0x00 copy 0x00
io 0x0100-0x010f [auto]
Socket 0:
Vcc 3.3V Vpp1 0.0V Vpp2 0.0V
interface type is "memory and I/O"
irq 11 [exclusive] [level]
function 0:
config base 0x0200
option 0x41 status 0x00 pin 0x00 copy 0x00
io 0x0110-0x011f [auto] 

The Memory Sticks can be mounted using

mount -v -t vfat /dev/hdb1 /memstick

Don't forget to use /sbin/cardctl eject 0 (assuming the card is in slot 0) before removing memory as this should notify the client drivers that the card is going to be removed and (hopefully) encourage them to make any outstanding writes before the power gets cut ;-)


boot = /dev/hda
menu-scheme = Wg:kw:Wg:Wg
timeout = 80
message = /boot/message

    image = /boot/vmlinuz
        label = linux
        root = /dev/hda7
        initrd = /boot/initrd

# linux3 is my non-X boot mode.

    image = /boot/vmlinuz
        label = linux3
        root = /dev/hda7
        initrd = /boot/initrd
        append = "3"

    image = /boot/vmlinuz.suse
        label = failsafe
        root = /dev/hda7
        initrd = /boot/initrd.suse
        append = "disableapic ide=nodma apm=off"

    image = /boot/memtest.bin
        label = memtest86


# /.../
# SaX generated XFree86 config file
# Created on: 1990-01-01.
# Version: 4.3
# Contact: Marcus Schaefer <>, 2001
# Automatically generated by [SaX2] (4.3)

Section "Files"
  FontPath     "/usr/X11R6/lib/X11/fonts/75dpi:unscaled"
  FontPath     "/usr/X11R6/lib/X11/fonts/local"
  FontPath     "/usr/X11R6/lib/X11/fonts/misc:unscaled"
  FontPath     "/usr/X11R6/lib/X11/fonts/75dpi:unscaled"
  FontPath     "/usr/X11R6/lib/X11/fonts/100dpi:unscaled"
  FontPath     "/usr/X11R6/lib/X11/fonts/Type1"
  FontPath     "/usr/X11R6/lib/X11/fonts/URW"
  FontPath     "/usr/X11R6/lib/X11/fonts/Speedo"
  FontPath     "/usr/X11R6/lib/X11/fonts/PEX"
  FontPath     "/usr/X11R6/lib/X11/fonts/cyrillic"
  FontPath     "/usr/X11R6/lib/X11/fonts/latin2/misc:unscaled"
  FontPath     "/usr/X11R6/lib/X11/fonts/latin2/75dpi:unscaled"
  FontPath     "/usr/X11R6/lib/X11/fonts/latin2/100dpi:unscaled"
  FontPath     "/usr/X11R6/lib/X11/fonts/latin2/Type1"
  FontPath     "/usr/X11R6/lib/X11/fonts/latin7/75dpi:unscaled"
  FontPath     "/usr/X11R6/lib/X11/fonts/baekmuk:unscaled"
  FontPath     "/usr/X11R6/lib/X11/fonts/japanese:unscaled"
  FontPath     "/usr/X11R6/lib/X11/fonts/kwintv"
  FontPath     "/usr/X11R6/lib/X11/fonts/truetype"
  FontPath     "/usr/X11R6/lib/X11/fonts/uni"
  FontPath     "/usr/X11R6/lib/X11/fonts/CID"
  FontPath     "/usr/X11R6/lib/X11/fonts/ucs/misc"
  FontPath     "/usr/X11R6/lib/X11/fonts/ucs/75dpi:unscaled"
  FontPath     "/usr/X11R6/lib/X11/fonts/ucs/100dpi:unscaled"
  FontPath     "/usr/X11R6/lib/X11/fonts/hellas/misc:unscaled"
  FontPath     "/usr/X11R6/lib/X11/fonts/hellas/75dpi:unscaled"
  FontPath     "/usr/X11R6/lib/X11/fonts/hellas/100dpi:unscaled"
  FontPath     "/usr/X11R6/lib/X11/fonts/hellas/Type1"
  FontPath     "/usr/X11R6/lib/X11/fonts/misc/sgi"
  FontPath     "/usr/X11R6/lib/X11/fonts/xtest"
  ModulePath   "/usr/X11R6/lib/modules"
  RgbPath      "/usr/X11R6/lib/X11/rgb"

Section "ServerFlags"
  Option       "AllowMouseOpenFail"

Section "Module"
  Load         "type1"
  Load         "speedo"
  Load         "extmod"
  Load         "freetype"

Section "InputDevice"
  Driver       "keyboard"
  Identifier   "Keyboard[0]"
  Option       "Protocol" "Standard"
  Option       "XkbKeyCodes" "xfree86"
  Option       "XkbLayout" "gb"
  Option       "XkbModel" "pc104"
  Option       "XkbRules" "xfree86"

Section "InputDevice"
  Driver       "mouse"
  Identifier   "Mouse[1]"
  Option       "Device" "/dev/psaux"
  Option       "Emulate3Buttons" "on"
  Option       "Emulate3Timeout" "50"
  Option       "InputFashion" "Mouse"
  Option       "Name" "AutoDetected"
  Option       "Protocol" "ps/2"
  Option       "Vendor" "AutoDetected"

Section "Monitor"
  HorizSync    30-65
  Identifier   "Monitor[0]"
  ModelName    "AutoDetected"
  VendorName   "AutoDetected"
  VertRefresh  58-78
  UseModes     "Modes[0]"

Section "Modes"
  Identifier   "Modes[0]"
  Modeline      "640x480" 27.16 640 656 720 864 480 480 490 501
  Modeline      "640x480" 31.15 640 656 720 864 480 480 490 501

Section "Screen"
  DefaultDepth 24
  SubSection "Display"
    Depth      24
    Modes      "640x480"
  Device       "Device[0]"
  Identifier   "Screen[0]"
  Monitor      "Monitor[0]"

Section "Device"
  BoardName    "65550"
  Driver       "chips"
  Identifier   "Device[0]"
  Screen       0
  VendorName   "Chips and Technologies"

Section "ServerLayout"
  Identifier   "Layout[all]"
  InputDevice  "Keyboard[0]" "CoreKeyboard"
  InputDevice  "Mouse[1]" "CorePointer"
  Option       "Clone" "off"
  Option       "Xinerama" "off"
  Screen       "Screen[0]"

Section "DRI"
    Group      "video"
    Mode       0660


# ALSA driver configuration
# This configuration is generated with the alsactl program.

soundcard("card1") {
  mixer("Yamaha OPL3-SA3") {
    ; Wide : Min 0 Max 7
    element("3D Effect",0,600,_3D_Effect1(wide=0))
    ; Bass : Min 0 Max 7
    ; Treble : Min 0 Max 7
    element("Tone Control",0,500,ToneControl1(bass=0,treble=0))
    element("Master Switch",0,100,Switch1(on,on))
    ; Voice 0 : Min 0 Max 15
    ; Voice 1 : Min 0 Max 15
    element("Master Volume",0,200,Volume1(11,11))
    element("MIC Switch",0,101,Switch2(off))
    ; Voice 0 : Min 0 Max 31
    element("MIC Volume",0,200,Volume1(0))
    element("PCM Switch",0,100,Switch1(on,on))
    ; Voice 0 : Min 0 Max 63
    ; Voice 1 : Min 0 Max 63
    element("PCM Volume",0,200,Volume1(57,57))
    element("Loopback Switch",0,101,Switch2(off))
    ; Voice 0 : Min 0 Max 63
    element("Loopback Volume",0,200,Volume1(0))
    ; Voice 0 : Min 0 Max 15
    ; Voice 1 : Min 0 Max 15
    element("Input Gain Volume",0,200,Volume1(0,0))
    element("Mono Input Switch",0,101,Switch2(off))
    ; Voice 0 : Min 0 Max 15
    element("Mono Input Volume",0,200,Volume1(0))
    element("FM Input Switch",0,100,Switch1(off,off))
    ; Voice 0 : Min 0 Max 31
    ; Voice 1 : Min 0 Max 31
    element("FM Input Volume",0,200,Volume1(0,0))
    element("CD Input Switch",0,100,Switch1(off,off))
    ; Voice 0 : Min 0 Max 31
    ; Voice 1 : Min 0 Max 31
    element("CD Input Volume",0,200,Volume1(0,0))
    element("Line Input Switch",0,100,Switch1(off,off))
    ; Voice 0 : Min 0 Max 31
    ; Voice 1 : Min 0 Max 31
    element("Line Input Volume",0,200,Volume1(0,0))
    ; Voice 0 : Min 0 Max 1
    ; Voice 1 : Min 0 Max 1
    element("MIC Gain Volume",0,200,Volume1(0,0))
    element("Master Mono Switch",0,101,Switch2(off))
    element("Input MUX",0,400,Mux1(element("Line",0,0),element("Line",0,0)))

Sound section from /etc/modules.conf

# --- BEGIN: Generated by ALSACONF, do not edit. ---
# --- ALSACONF verion 0.5.10 ---
alias char-major-116 snd
alias snd-card-0 snd-card-opl3sa2
alias char-major-14 soundcore
alias sound-slot-0 snd-card-0
alias sound-service-0-0 snd-mixer-oss
alias sound-service-0-1 snd-seq-oss
alias sound-service-0-3 snd-pcm-oss
alias sound-service-0-8 snd-seq-oss
alias sound-service-0-12 snd-pcm-oss
options snd snd_major=116 snd_cards_limit=1
options snd-card-opl3sa2 snd_index=0 snd_fm_port=-1 snd_midi_port=-1 snd_port=0x370 snd_wss_port=0x530 snd_isapnp=0 snd_
dma1=1 snd_dma2=0 snd_irq=5
# --- END: Generated by ALSACONF, do not edit. ---