Initial dump from Sourceforge website

This commit is contained in:
Simon Howard 2023-08-03 23:03:18 -04:00
commit 0b086fc6bc
99 changed files with 2421 additions and 0 deletions

37
dev.shtml Normal file
View File

@ -0,0 +1,37 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<!--#include virtual="header"-->
<h2> Development Stuff </h2>
<p>
Here is some stuff I have written for Revo/Psion Linux:
</p>
<ul>
<li> The <a href="spkg.shtml">spkg</a> package manager
<li> <a href="psionconf.shtml">PsionConf</a>: A small PicoGUI Psion Linux
configuration program
<li> <a href="picotone.shtml">PicoTone</a>: a touch tone phone dialer
<li> <a href="dev/psionw_sound.c">Kernel Sound Driver</a>: Now in the -5mx
patch tree
</ul>
<hr width="50%">
<a href="dev/pdf/">Various gathered information</a>:
This is mostly information (datasheets etc) I've gathered about the
Windermere hardware and thought people might find useful.
Note that the <i>Series_5mx_specs.pdf</i> file which Psion kindly provided
to the linux developers is not available here: it is not to be publicly
distributed, at Psions request. If you need a copy, post to the
Psion Linux mailing list.
<!--#include virtual="footer"-->
</html>

41
dev/adc7843_diff Normal file
View File

@ -0,0 +1,41 @@
89a90
> static struct tpanel_sample old_ts = {0,0,0};
92c93
< int trigger, x, y;
---
> int trigger;
113,114d113
< x = ts.x;
< y = ts.y;
116,120c115,139
< /* Converte to screen coordinates... */
< x = ( ( ts.x - cal->min_x ) * cal->x_res / ( cal->max_x - cal->min_x ) );
< y = ( ( ts.y - cal->min_y ) * cal->y_res / ( cal->max_y - cal->min_y ) );
<
< infilter_send_pointing(PG_TRIGGER_PNTR_STATUS,x,y,ts.state,NULL);
---
> /* if pointer is up, keep the cursor position from when it was up */
> if (!ts.state) {
> ts.x = old_ts.x;
> ts.y = old_ts.y;
> } else {
> /* Converte to screen coordinates... */
> ts.x = ((ts.x - cal->min_x) * cal->x_res / (cal->max_x - cal->min_x));
> ts.y = ((ts.y - cal->min_y) * cal->y_res / (cal->max_y - cal->min_y));
> }
>
> /* if nothing has changed, dont send an event */
> if (ts.state == old_ts.state && ts.x == old_ts.x && ts.y == old_ts.y)
> return;
>
> if (old_ts.state && !ts.state)
> infilter_send_pointing(PG_TRIGGER_UP, ts.x, ts.y, ts.state, NULL);
> else if (!old_ts.state && ts.state)
> infilter_send_pointing(PG_TRIGGER_DOWN, ts.x, ts.y, ts.state, NULL);
>
> if (ts.x != old_ts.x || ts.y != old_ts.y)
> infilter_send_pointing(PG_TRIGGER_MOVE, ts.x, ts.y, ts.state, NULL);
>
> /* save ts for next time */
> old_ts = ts;
>

76
dev/adc_diff Normal file
View File

@ -0,0 +1,76 @@
Index: adc7843.c
===================================================================
RCS file: /cvsroot/pgui/pgserver/input/adc7843.c,v
retrieving revision 1.6
diff -u -r1.6 adc7843.c
--- adc7843.c 3 Jul 2002 22:03:29 -0000 1.6
+++ adc7843.c 6 Nov 2002 00:25:45 -0000
@@ -60,16 +60,16 @@
int adc7843_fd;
-struct tpanel_sample {
- u16 state;
- u16 x;
- u16 y;
-};
-
/******************************************** Implementations */
g_error adc7843_init(void) {
adc7843_fd = open("/dev/tpanel",O_NONBLOCK);
+
+ /* devfs name */
+
+ if (adc7843_fd <= 0)
+ adc7843_fd = open("/dev/misc/adc7843", O_NONBLOCK);
+
if (adc7843_fd <= 0)
return mkerror(PG_ERRT_IO, 74);
@@ -87,9 +87,10 @@
}
int adc7843_fd_activate(int fd) {
- struct tpanel_sample ts;
+ int state;
char buffer[6];
- int trigger, x, y;
+ int trigger;
+ static int x=0, y=0;
if (!cal) {
if (!vid)
@@ -107,17 +108,22 @@
return 1;
/* Convert the bytes to unsigned integers... */
- ts.state = ( ( (buffer[0]) << 8 ) + buffer[1] );
- ts.x = ( ( (buffer[2]) << 8 ) + buffer[3] );
- ts.y = ( ( (buffer[4]) << 8 ) + buffer[5] );
- x = ts.x;
- y = ts.y;
-
- /* Converte to screen coordinates... */
- x = ( ( ts.x - cal->min_x ) * cal->x_res / ( cal->max_x - cal->min_x ) );
- y = ( ( ts.y - cal->min_y ) * cal->y_res / ( cal->max_y - cal->min_y ) );
+ state = ( ( (buffer[0]) << 8 ) + buffer[1] );
+
+ /* save x,y in static variables. when pen up, send the last known
+ coordinates */
+
+ if (state) {
+ x = ( ( (buffer[2]) << 8 ) + buffer[3] );
+ y = ( ( (buffer[4]) << 8 ) + buffer[5] );
+
+ /* Convert to screen coordinates... */
+ x = ( ( x - cal->min_x ) * cal->x_res / ( cal->max_x - cal->min_x ) );
+ y = ( ( y - cal->min_y ) * cal->y_res / ( cal->max_y - cal->min_y ) );
+ }
- infilter_send_pointing(PG_TRIGGER_PNTR_STATUS,x,y,ts.state,NULL);
+ infilter_send_pointing(PG_TRIGGER_PNTR_STATUS,x,y,state,NULL);
+
return 1;
}

166
dev/pdf/battery_info.txt Normal file
View File

@ -0,0 +1,166 @@
The battery level(s) can be monitored using the auxilary channels of the ADC
for the touchscreen. Here are some emails which may be useful:
From: Simon D Howard <sdh300@ecs.soton.ac.uk>
To: Tony Lindgren <tony@atomide.com>
cc: Linux-7110-psion@lists.sourceforge.net
Subject: Re: [Linux-7110-psion] /proc patch
Date: Mon, 29 Apr 2002 18:57:35 +0100 (BST)
On Mon, 29 Apr 2002, Tony Lindgren wrote:
> So sounds like your SSI extra channel code might work on 5mx!
> Can you post it so we can try if you don't have a 5mx?
Well, it wasnt really specific code, I just hacked about with the adc
code. Currently it listens on the first 2 ports (which give the x, y
coordinate). If you change the following lines:
ssi_transmit_data(dev,0xd000);
ssi_transmit_data(dev,0x9000);
to
ssi_transmit_data(dev,0xd000 | 0x2000);
ssi_transmit_data(dev,0x9000 | 0x2000);
it ought to read the other channels (according to the adc datasheet
anyway, it didnt work so it may be that I'm totally wrong). I wrote a
small program to print the output from /dev/tpanel but I dont have it with
me right now - I adapted the picogui tpanel code.
Simon
_______________________________________________
Linux-7110-psion mailing list
Linux-7110-psion@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-7110-psion
From: "Thilo Hille" <thilo@resourcery.de>
To: "Simon D Howard" <sdh300@ecs.soton.ac.uk>,
"Tony Lindgren" <tony@atomide.com>
Subject: Re: [Linux-7110-psion] /proc patch
Date: Tue, 30 Apr 2002 14:40:02 +0200
gotcha..
> So sounds like your SSI extra channel code might work on 5mx!
> Can you post it so we can try if you don't have a 5mx?
i just tweaked the controlbytes in adc7843.c
ssi_transmit_data(dev,0xa400); //channel 3
ssi_transmit_data(dev,0xe400); //channel 4
and voila shows up the battery state on channel three.
it stays around 2593 when accus inserted and drops down to <20 (needs about
a 3 minutes).
i think there are some capacitors discharging slowly this might be faster
when the external powersupply is disconnected.
how do we get this into an own driver?
Thilo Hille
resourcery GbR.
Habsburgerstr. 11
79104 Freiburg
Tel.: 0761-4567807
Fax.: 0761-4567805
thilo@resourcery.de
From: "Thilo Hille" <thilo@resourcery.de>
To: <linux-7110-psion@lists.sourceforge.net>
Subject: [Linux-7110-psion] power consumtion
Date: Tue, 30 Apr 2002 14:57:01 +0200
i just measured the battery current.
its about 2.74V.
the adc reports about 2594 (maybe rough mV?)
Thilo Hille
resourcery GbR.
Habsburgerstr. 11
79104 Freiburg
Tel.: 0761-4567807
Fax.: 0761-4567805
thilo@resourcery.de
_______________________________________________
Linux-7110-psion mailing list
Linux-7110-psion@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-7110-psion
From: Simon D Howard <sdh300@ecs.soton.ac.uk>
To: Thilo Hille <thilo@resourcery.de>
cc: linux-7110-psion@lists.sourceforge.net
Subject: Re: [Linux-7110-psion] /proc patch
Date: Tue, 30 Apr 2002 19:23:27 +0100 (BST)
On Tue, 30 Apr 2002, Thilo Hille wrote:
> i just tweaked the controlbytes in adc7843.c
> ssi_transmit_data(dev,0xa400); //channel 3
> ssi_transmit_data(dev,0xe400); //channel 4
> and voila shows up the battery state on channel three.
> it stays around 2593 when accus inserted and drops down to <20 (needs about
> a 3 minutes).
> i think there are some capacitors discharging slowly this might be faster
> when the external powersupply is disconnected.
Good news, this seems to work on my revo too. I found this slightly
surprising as the email tony quoted suggested the battery monitoring was
done differently. When charging, it seems to reach a maximum of around
3950 but drops to around 3500 when its finished. EPOC seems to use
3950-4000 as its "100%" value too - I get similar readings from its
battery monitor.
I also get ~2464 (invariant) from the other channel - presumably the
backup battery.
> how do we get this into an own driver?
"with difficulty" :)
Simon
_______________________________________________
Linux-7110-psion mailing list
Linux-7110-psion@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-7110-psion
From: "Thilo Hille" <thilo@resourcery.de>
To: "Simon D Howard" <sdh300@ecs.soton.ac.uk>
Cc: <linux-7110-psion@lists.sourceforge.net>
Subject: Re: [Linux-7110-psion] /proc patch
Date: Tue, 30 Apr 2002 20:51:00 +0200
hi simon,
> I also get ~2464 (invariant) from the other channel - presumably the
> backup battery.
hmmm i dont have a backupbattery inserted and ch4 shows up ~4084.
i dont have one at hands for now, but tomorrow i ll try it.
did you try to remove the backup battery while watching the 4th channel?
(hey, its like tv :)
i really forgot about the backupbattery. i removed it 2 month ago and as id
never used epoc since than i never needed it.
greetingz
Thilo Hille
resourcery GbR.
Habsburgerstr. 11
79104 Freiburg
Tel.: 0761-4567807
Fax.: 0761-4567805
thilo@resourcery.de
_______________________________________________
Linux-7110-psion mailing list
Linux-7110-psion@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-7110-psion

31
dev/pdf/cf-etna.txt Normal file
View File

@ -0,0 +1,31 @@
ETNA CF CLPS7110 Name Description
3509-0169-02 Memory I/O
(C)PSION PLC
A12 R02 NL
9732M3006
Pin 1 <-> Pin 47 D08
Pin 2 <-> Pin 48 D09
Pin 3 <-> Pin 49 D10
Pin 4 <-> Pin 27 D11
Pin 5 <-> Pin 28 D12
Pin 6 <-> Pin 29 D13
Pin 7 <-> Pin 30 D14
Pin 8 <-> Pin 31 D15
Pin 9 <-- Pin 208 CS4 Expansion select 4 (PCMCIA 0)
Pin 10 <-- Pin 1 CS5 Expansion select 5 (PCMCIA 1)
Pin 11 <-- Pin 206 NCS2 ROM select 2 (Etna registers)
Pin 12 GND
Pin 13 VCC
Pin 14 --> Pin 45 BVD2 -SPKR n/a or speaker
Pin 15 --> Pin 45 BVD2 -SPKR n/a or speaker
Pin 16 <-- Pin 24 WP -IOIS16 Write protect or 16-bit I/O
Pin 17 <-- Pin 42 -WAIT Wait
Pin 18 <-- Pin 33 -VS1 Voltage select 1
Pin 19 <-- Pin 40 -VS2 Voltage select 2
Pin 20 <-- Pin 26 -CD1 Card detect (grounded in CF)
Pin 21 Pin 50 GND
Pin 22 <-- Pin 37 RDY/-BSY -IREQ Card ready or interrupt REQ
Pin 23
Pin 100 <-- Pin 25 -CD2 Card detect (grounded in CF)

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
dev/pdf/ps7110db.pdf Normal file

Binary file not shown.

212
dev/pdf/psion_mails.txt Normal file
View File

@ -0,0 +1,212 @@
These are emails from an employee at Psion who worked on the 5mx and
provide some technical information. Thanks to Tony <tony@atomide.com> for
forwarding me these.
Date: Tue, 08 Aug 2000 20:52:12 +0100
From: Atish Nazir <hashaday@littleworld.freeserve.co.uk>
To: Peter Liniker <pl198@doc.ic.ac.uk>
Subject: Re: [Linux-7110-psion] psion5mx (fwd)
re:
---
> * the memory map
---
be more specific. what would you like to access?
re:
---
> * MMU details, esp. EPOC's MMU usage, so that ArLo can load the kernel
> into memory, initialise FiPaBoL and start it
---
hard one, because i'm not too clued up on that aspect of base. one
solution would be to install yourself as a "PartnerOS" - something EPOC
does have a provision for for the Philips smart phone of years ago.
documentation is very sparse though.
re:
---
> * ROM/serial/CF boot mechanism (latter two netbook only)
---
hehehe boss and i wrote this bit :o) protocol is basically YModem with
a few optional extras - i.e. any terminal program will be okay. the
exact specifics of the S7 client is unknown to me as a contractor at
Enterprise wrote it (a perpetually up beat guy).
re:
---
> * ROM/RAM speeds
---
varies according to machine _and_ when it was built in production
cycle. i.e. early machines have flash and later we switch to mask ROM
(with a small patch flash, should it be needed).
re:
---
> * interrupt handling
---
erm, it works...
re:
---
> * all the device interface specs:
> -- CF slot/card
---
function spec for ETNA - i'll find out, whom you have to speak about
this or whether i can release this (quite possible, but remember to say
thank you).
re:
---
> -- PCMCIA slot/card
---
functional spec for ASIC14 - ask Enterprise.
re:
---
> -- sound in/out, audio codecs
---
5, 5mx and Revo, sound out is identical (same drivers used in fact).
except on Revo, there's a slight pin move (can't remember what however,
it wasn't the buzzline). Revo sounds record is obviously disabled...
S7, go ask Enterprise...
re:
---
> -- screen
---
Eiger and Windermere have similar, but certainly different LCD
controllers on board - you'll have to change you device driver. i can't
give more details, because i don't know any more here - never worked on
that aspect.
re:
---
> -- pointer
---
ADC talks directly to main ASIC via SSP interface (changed on 5mx)
re:
---
> -- serial
---
UARTs integrated on main ASICS. Eiger only had one, Windy has two.
re:
---
> -- irda
---
see the bit about UARTs - same UARTs used for RS232 and talking to
IRDA.
re:
---
> -- power management/monitoring
---
hmm. 5, 5mx have voltmeters (same ADC as pointer). Revo has dedicated
current counter, talks via GPIO to main ASIC with a very slow
asynchronous serial protocol.
re:
---
> -- timers
> * Which of these are the same as series5?
---
same as before.
re:
---
> * Config used for the SA1100 and support.
---
how many ports are going here? the people to contact would be Psion
Enterprise as it's really more their turf.
re:
---
> * "ETNA" specs (this is the main ASIC, AFAIK)
---
no, rubbish. ETNA is a helper ASIC. chip code names: Eiger,
Windermere and SA1100 (affectionately known as Sally), which correspond
to 5, 5mx and Revo, and S7 and Net book.
re:
---
> * We'd also like the ER5 DDK info/headers - enough to compile arlo
> "properly".
---
you'll need the E32 tree, this comes with the OCK and DDK. since i use
the OCK (something only available to licensees of Symbian), i wouldn't
know how to obtain a copy of the DDK from Symbian (other than asking
nicely, but i can't imagine that working when they inevitably ask why
you want it). soz. been speaking to bossman and it looks like you'll
have to become a Symbian licencee / partner - PSION can't help you here
because it will violate our agreement with the collective.
IF YOU'RE INTERESTED:
if one individual is prepared to sign an NDA and many other evil
agreements (IPR etc) we have, i _might_ (not a promise, a lot of red
tape would have to be cleared and i'd have to speak to a lot of people)
be able to provide the full Windermere spec for free.
however if a few people are London based, what may a more attractive
solution, a few members of the systems team could give a short seminar
or something along those lines, answering questions in person, giving
the vital information and so forth...
n.b. both these proposals have to be confirmed with other powers that
be.
--- --- ---
.~. the way of the Sacred Penguin is the path of
/V\ the truly righteous...
// \\/
/( ) hashaday@littleworld.freeserve.co.uk
^`~'^ http://thor.prohosting.com/~hashaday/
_______________________________________________
Linux-7110-psion mailing list
Linux-7110-psion@lists.sourceforge.net
http://lists.sourceforge.net/mailman/listinfo/linux-7110-psion
---------- Forwarded message ----------
Date: Tue, 08 Aug 2000 18:45:00 +0100
From: Atish Nazir <hashaday@littleworld.freeserve.co.uk>
To: Peter Liniker <pl198@doc.ic.ac.uk>
Subject: Re: [Linux-7110-psion] psion5mx (fwd)
re:
---
> Etna is the S5 ASIC, AFAIK.
---
ETNA (aka ASIC12) is the _helper_ ASIC for Eiger (S5) and Windermere
(5MX). it adds CF capabilities and some other gubbins. basically it
adds more pins to the CPU.
re:
---
> Is the S5mx/7 ASIC called Etna? (Although you may not be able to answer
> this!)
---
the S7 and NetBook uses ASIC14 (aka "that many legged bastard"), which
has nothing really in common with ETNA other than it was designed by the
same guy (and uses same VHDL for the timers, copy and paste is a
wonderful thing). it's also a helper ASIC, the exact specifics i can't
be sure of because Enterprise have done a lot of developmental work on
it...
--- --- ---
.~. the way of the Sacred Penguin is the path of
/V\ the truly righteous...
// \\/
/( ) hashaday@littleworld.freeserve.co.uk
^`~'^ http://thor.prohosting.com/~hashaday/
_______________________________________________
Linux-7110-psion mailing list
Linux-7110-psion@lists.sourceforge.net
http://lists.sourceforge.net/mailman/listinfo/linux-7110-psion

8
dev/pdf/readme.txt Normal file
View File

@ -0,0 +1,8 @@
ps7110db.pdf - 7110 processor data sheet
msm7717_01_02_03.pdf - 7717 CODEC sound chip
sbas090a.pdf - 7843 ADC chip (touchscreen/battery monitor)
psion_mails.txt - Emails from a Psion Employee providing some
technical insight..
battery_info.txt - Results of hacking with the ADC in order to read
the battery level.

BIN
dev/pdf/sbas090a.pdf Normal file

Binary file not shown.

BIN
dev/pdf/thumbquickref.pdf Normal file

Binary file not shown.

360
dev/psionw_sound.c Normal file
View File

@ -0,0 +1,360 @@
/*
Driver for PsionW Sound output
(c) 2002 Simon Howard
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/* TODO:
*
* - Microphone support
* - /dev/mixer support
*/
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/types.h>
#include <linux/version.h>
#include <linux/module.h>
#include <linux/sound.h>
#include <linux/soundcard.h>
#include <asm/irq.h>
#include <asm/mach/irq.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#include <asm/hardware/psionw.h>
#include <asm/arch/irqs.h>
#include <asm/arch/psionw-power.h>
#include "ulaw.h"
/* these ought to be in the hardware headers: */
#define CODOUTEN (1 << 0)
#define CODINEN (1 << 1)
#define SAMPLE_RATE 8000 /* this cant be changed */
static int users;
static struct semaphore users_lock;
extern void enable_irq(unsigned int irq);
extern void disable_irq(unsigned int irq);
static int audio_dev;
/* buffer size */
#define BUFSIZE 128
/* lock for access to writebuf. the interrupt handler does not check
* for this but interrupts are also disabled while we access writebuf
* in write
*/
static struct semaphore writebuf_lock;
/* freelist for buffering data */
static unsigned char writebuf[BUFSIZE];
static int writebuf_head, writebuf_tail, writebuf_size;
/* interrupt routine */
void psionw_sound_isr(unsigned int irq)
{
int i, count;
/* write some more data to the speaker */
count = writebuf_size < 8 ? writebuf_size : 8;
for (i=0; i<count; ++i) {
psionw_writeb(dsp_ulaw[writebuf[writebuf_head]], CODR);
writebuf_head = (writebuf_head + 1) % BUFSIZE;
}
for (; i<8; ++i) {
psionw_writeb(0, CODR);
}
writebuf_size -= count;
/* if we had nothing left, stop interrupts until we
* get more (set in the write function)
*/
if (count == 0)
disable_irq(IRQ_CSINT);
/* clear interrupt */
psionw_writel(1, COEOI);
}
static ssize_t psionw_sound_read(struct file *file, char *buffer,
size_t count, loff_t *ppos)
{
/* insert microphone code here */
return count;
}
static ssize_t psionw_sound_write(struct file *file, const char *buffer,
size_t count, loff_t *ppos)
{
int i, n, ret = 0;
while (count > 0) {
/* check we can fit anything into the buffer */
if (writebuf_size >= BUFSIZE) {
if (file->f_flags & O_NONBLOCK)
break;
set_current_state(TASK_INTERRUPTIBLE);
schedule_timeout(1);
continue;
}
down(&writebuf_lock);
/* disable irq while we do this */
disable_irq(IRQ_CSINT);
/* fit in as much as we can to the write buffer */
if (count > BUFSIZE - writebuf_size)
n = BUFSIZE - writebuf_size;
else
n = count;
/* this is complicated stuff to add to the buffer in blocks
* rather than byte-by-byte, for speed
* we dont want to disable the sound IRQ for too long or we
* get nasty breaks in the sound
*/
if (writebuf_tail >= writebuf_head) {
/* fill in as much as possible at the end */
i = BUFSIZE - writebuf_tail;
if (i >= n) {
/* we can fit them all at the end */
memcpy(writebuf + writebuf_tail, buffer, n);
} else {
/* first part at the end of buffer */
memcpy(writebuf + writebuf_tail, buffer, i);
/* second part at the beginning */
memcpy(writebuf, buffer+i, n-i);
}
} else {
/* just fit in as much as we can */
memcpy(writebuf + writebuf_tail, buffer, n);
}
writebuf_tail = (writebuf_tail + n) % BUFSIZE;
writebuf_size += n;
count -= n;
buffer += n;
ret += n;
/* enable irq again */
enable_irq(IRQ_CSINT);
up(&writebuf_lock);
}
if (file->f_flags & O_NONBLOCK && ret == 0)
return -EAGAIN;
return ret;
}
static int psionw_sound_ioctl(struct inode *inode, struct file *file,
unsigned int cmd, unsigned long arg)
{
int val;
switch (cmd) {
case OSS_GETVERSION:
return put_user(SOUND_VERSION, (int *)arg);
case SNDCTL_DSP_RESET:
return 0;
case SNDCTL_DSP_SYNC:
/* we cant really do this, but we'll pretend
* we can, to keep programs that use it happy
*/
return 0;
case SNDCTL_DSP_SPEED: /* set sample rate */
/* we cant change it */
if (get_user(val, (int *)arg))
return -EFAULT;
if (val >= 0)
return put_user(SAMPLE_RATE, (int *)arg);
else
return -EFAULT;
case SNDCTL_DSP_STEREO: /* set stereo or mono */
if (get_user(val, (int *)arg))
return -EFAULT;
/* we are stuck in mono mode */
if (val)
printk("psionw_sound: attempt to put in stereo mode (unsupported)\n");
return 0;
case SNDCTL_DSP_GETBLKSIZE:
return put_user(8, (int *)arg); /* 8 byte block size (?) */
case SNDCTL_DSP_GETFMTS:
return put_user(AFMT_U8, (int *)arg);
case SNDCTL_DSP_SETFMT:
return put_user(AFMT_U8, (int *)arg);
case SNDCTL_DSP_CHANNELS: /* set channels */
return put_user(1, (int *) arg);
case SNDCTL_DSP_NONBLOCK:
file->f_flags |= O_NONBLOCK;
}
return -EINVAL;
}
static int psionw_sound_open(struct inode *inode, struct file *file)
{
down(&users_lock);
if (users > 0) {
up(&users_lock);
return -EBUSY;
}
++users;
/* empty list */
writebuf_head = writebuf_tail = writebuf_size = 0;
/* enable codec */
psionw_writeb(psionw_readb(PDDR) | PDDR_AMPEN | PDDR_CDE, PDDR);
psionw_writel(psionw_readl(CONFG) | CODINEN | CODOUTEN, CONFG);
/* enable sound irq */
irq_desc[IRQ_CSINT].mask_ack = psionw_sound_isr;
enable_irq(IRQ_CSINT);
up(&users_lock);
return 0;
}
static int psionw_sound_release(struct inode *inode, struct file *file)
{
down(&users_lock);
--users;
/* disable codec */
psionw_writeb(psionw_readb(PDDR) & ~(PDDR_AMPEN|PDDR_CDE), PDDR);
psionw_writel(psionw_readl(CONFG) & ~(CODINEN|CODOUTEN), CONFG);
/* disable sound irq */
disable_irq(IRQ_CSINT);
up(&users_lock);
return 0;
}
static int psionw_sound_mmap(struct file *file, struct vm_area_struct *vma)
{
return -ENODEV;
}
static struct file_operations sound_ops = {
owner: THIS_MODULE,
llseek: no_llseek,
read: psionw_sound_read,
write: psionw_sound_write,
ioctl: psionw_sound_ioctl,
mmap: psionw_sound_mmap,
open: psionw_sound_open,
release: psionw_sound_release,
};
int __init init_psionw_sound(void)
{
audio_dev = register_sound_dsp(&sound_ops, -1);
if (audio_dev < 0) {
printk(KERN_ERR "psionw_sound: cannot register sound device\n");
return -ENODEV;
}
init_MUTEX(&writebuf_lock);
init_MUTEX(&users_lock);
printk("psionw_sound: initialised sound output\n");
return 0;
}
void __exit cleanup_psionw_sound(void)
{
unregister_sound_dsp(audio_dev);
}
MODULE_DESCRIPTION("psionw sound output driver");
MODULE_AUTHOR("Simon Howard");
MODULE_LICENSE("GPL");
module_init(init_psionw_sound);
module_exit(cleanup_psionw_sound);

50
download.shtml Normal file
View File

@ -0,0 +1,50 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<!--#include virtual="header"-->
<font color="red"><b>Warning: Booting linux will erase all data
stored in RAM. If you have important files stored in your palmtop,
be sure to make copies of them first.</b></font>
<h3>Downloads</h3>
<ul>
<li> <b> 1.1 </b>
<ul>
<li> <a href="download/1.1/ChangeLog">ChangeLog</a>
<li> <a href="download/1.1/omnibar.c">omnibar.c</a> - modified omnibar source
<li> <a href="download/1.1/lcdtux.tar.gz">lcdtux.tar.gz</a> - lcdtux theme
</ul>
<i> Revo </i>
<ul>
<li> <a href="download/1.1/revol-1.1.sis.zip">revol-1.1.sis.zip</a> (zipped EPOC package)
<li> <a href="download/1.1/revol-1.1.tar.gz">revol-1.1.tar.gz</a>
<li> <a href="download/1.1/revol-1.1.zip">revol-1.1.zip</a>
</ul>
<i>Revo Plus</i>
<ul>
<li> <a href="download/1.1/revol-1.1-revoplus.sis.zip">revol-1.1-revoplus.sis.zip</a> (zipped EPOC package)
<li> <a href="download/1.1/revol-1.1-revoplus.tar.gz">revol-1.1-revoplus.tar.gz</a>
<li> <a href="download/1.1/revol-1.1-revoplus.zip">revol-1.1-revoplus.zip</a>
</ul>
<li> <b> 1.0 </b>
<ul>
<li> <a href="download/1.0/omnibar.c">omnibar.c</a> - modified omnibar source
<li> <a href="download/1.0/revol-1.0.sis.zip">revol-1.0.sis.zip</a> (zipped EPOC package)
<li> <a href="download/1.0/revol-1.0.tar.gz">revol-1.0.tar.gz</a>
<li> <a href="download/1.0/revol-1.0.zip">revol-1.0.zip</a>
</ul>
</ul>
<!--#include virtual="footer"-->
</html>

Binary file not shown.

Binary file not shown.

BIN
download/1.0/revol-1.0.zip Normal file

Binary file not shown.

17
download/1.1/ChangeLog Normal file
View File

@ -0,0 +1,17 @@
1.1:
add:
pgmon (network usage monitor)
picomail
add themes:
lcdtux (lcdgray with tux background)
classique (macos platinum theme)
removed:
pspawn (obsolete from testing)
imgview (was broken)
omnibar now includes power off menu item
(uses /proc/psionw/state)
kernel includes my kernel patches for sound and
/proc/psionw additions
1.0:
initial version

BIN
download/1.1/lcdtux.tar.gz Normal file

Binary file not shown.

268
download/1.1/omnibar.c Normal file
View File

@ -0,0 +1,268 @@
/* $Id: omnibar.c,v 1.2 2001/12/01 01:12:01 gork Exp $
*
* omnibar.c - hopefully this will grow into a general interface
* for starting and manipulating applications, but
* for now it's pretty simple.
*
* PicoGUI small and efficient client/server GUI
* Copyright (C) 2000 Micah Dowty <micahjd@users.sourceforge.net>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* Contributors:
*
*
*
*/
#include <sys/types.h> /* For making directory listings */
#include <dirent.h>
#include <sys/stat.h>
#include <time.h> /* For clock */
/* FIXME: Check for Mac OS X using autoconf */
#if (defined(__APPLE__) && defined(__MACH__)) // Mac OS X and Darwin
#include <sys/types.h>
#include <sys/malloc.h>
#else
#include <malloc.h>
#endif
#include <stdio.h> /* file IO for getting CPU load */
#include <picogui.h>
#include <unistd.h>
#ifdef CLOCK
pghandle wClock;
#endif
pghandle wLoad;
/********* Event handlers */
/* Applications menu
* This whole thing's a kludge, I will write
* something better (using custom menus) soon
*/
int btnAppMenu(struct pgEvent *evt) {
pghandle *items;
struct dirent *dent;
int i,l;
DIR *d;
d = opendir("/pgui/apps");
/* FIXME : Count the items and allocate the array */
items = alloca(sizeof(pghandle) * 40);
/* Enter a new context before making the handles */
pgEnterContext();
/* Make handles */
rewinddir(d);
i = 0;
while (dent = readdir(d)) {
/* Skip all but applications */
l = strlen(dent->d_name);
if (l<4) continue;
if (dent->d_name[0] == '.')
continue;
/* Add item */
items[i++] = pgNewString(dent->d_name);
}
/* Run it */
i = pgMenuFromArray(items,i);
/* Result? */
if (i) {
char buf[80]; /* FIXME: Buffer overflow 'sploit waiting to happen! */
strcpy(buf,"/pgui/apps/");
strcat(buf,pgGetString(items[i-1]));
if (!vfork()) {
execlp(buf,buf,NULL);
pgMessageDialogFmt("Error",0,"There was an error starting the\nfollowing program:\n%s",buf);
exit(1);
}
}
/* Free the server memory and destroy our menu */
pgLeaveContext();
closedir(d);
return 0;
}
/* sdh: power off for psionw with appropriate kernel patch */
void psion_power_off()
{
FILE *fs = fopen("/proc/psionw/state", "w");
if (!fs) {
fprintf(stderr, "Can't open /proc/psionw/state: %s\n", strerror());
return;
}
fprintf(fs, "0\n");
fclose(fs);
return;
}
/* System menu */
int btnSysMenu(struct pgEvent *evt) {
switch (pgMenuFromString("Power Off|About PicoGUI...|"
"About Revol...|Quit PicoGUI...")) {
case 1:
psion_power_off();
break;
case 2:
/* Quick little about box */
pgMessageDialog("About PicoGUI",
"Welcome to PicoGUI!\n"
"This is a preview release (or a development\n"
"version if you're a developer :)\n"
"What you see may or may not represent the\n"
"future of PicoGUI, it is just a test.\n"
"For more information and the latest code, visit:\n"
" http://pgui.sourceforge.net\n"
"\n"
"-- Micah",0);
break;
case 3:
pgMessageDialog("About Revol",
"Revol: Linux on the Psion Revo\n"
"\n"
"By Simon Howard\n"
"\n"
"http://fraggle.alkali.org/stuffage/revol/\n"
"Feedback: sdh300@ecs.soton.ac.uk\n", 0);
break;
case 4:
/* Beam us out! */
if (pgMessageDialog("Quit PicoGUI", "Quit PicoGUI?",
PG_MSGBTN_YES | PG_MSGBTN_NO)==PG_MSGBTN_YES)
exit(0);
}
}
/* Called to update the clock and system load indicators */
void sysIdle(void) {
time_t now;
char *ct;
char buf[50];
FILE *f;
unsigned long cpu_user,cpu_nice,cpu_sys,cpu_idle;
unsigned long crun,ctotal;
static unsigned long ocrun = 0,octotal = 1;
#ifdef CLOCK
/* Get time */
time(&now);
ct = ctime(&now);
ct[strlen(ct)-1] = 0; /* Strip newline */
pgReplaceText(wClock,ct);
pgSubUpdate(wClock);
#endif
/* Get CPU load */
f = fopen("/proc/stat","r");
fgets(buf,50,f);
fclose(f);
sscanf(buf,"cpu %lu %lu %lu %lu",&cpu_user,&cpu_nice,&cpu_sys,&cpu_idle);
crun = cpu_user + cpu_sys;
ctotal = crun + cpu_nice + cpu_idle;
if (crun==ocrun || ctotal==octotal) return; /* Prevent SIGFPE */
pgSetWidget(wLoad,PG_WP_VALUE, (crun-ocrun) * 100 / (ctotal-octotal),0);
ocrun = crun;
octotal = ctotal;
pgSubUpdate(wLoad);
}
/********* Main program */
int main(int argc, char **argv) {
pghandle wLoadbox,fntLabel,fntLabelBold;
pgInit(argc,argv);
pgRegisterApp(PG_APP_TOOLBAR,"OmniBar",0);
/* A font for our labels */
fntLabel = pgNewFont("Helvetica",8,0);
fntLabelBold = pgNewFont("Helvetica",8,PG_FSTYLE_BOLD);
/* Top-level widgets */
pgNewWidget(PG_WIDGET_BUTTON,0,0);
pgSetWidget(PGDEFAULT,
PG_WP_TEXT,pgNewString("Applications"),
PG_WP_EXTDEVENTS,PG_EXEV_PNTR_DOWN,
0);
pgBind(PGDEFAULT,PG_WE_PNTR_DOWN,&btnAppMenu,NULL);
pgNewWidget(PG_WIDGET_BUTTON,0,0);
pgSetWidget(PGDEFAULT,
PG_WP_TEXT,pgNewString("System"),
PG_WP_EXTDEVENTS,PG_EXEV_PNTR_DOWN,
0);
pgBind(PGDEFAULT,PG_WE_PNTR_DOWN,&btnSysMenu,NULL);
#ifdef CLOCK
wClock = pgNewWidget(PG_WIDGET_LABEL,0,0);
pgSetWidget(PGDEFAULT,
PG_WP_SIDE,PG_S_RIGHT,
PG_WP_FONT,fntLabel,
PG_WP_TRANSPARENT,0,
0);
#endif
wLoadbox = pgNewWidget(PG_WIDGET_BOX,0,0);
pgSetWidget(PGDEFAULT,
PG_WP_SIDE,PG_S_RIGHT,
PG_WP_SIZE,200,
0);
/* Inside the load box */
pgNewWidget(PG_WIDGET_LABEL,PG_DERIVE_INSIDE,wLoadbox);
pgSetWidget(PGDEFAULT,
PG_WP_TEXT,pgNewString("CPU"),
PG_WP_SIDE,PG_S_RIGHT,
PG_WP_FONT,fntLabel,
0);
wLoad = pgNewWidget(PG_WIDGET_INDICATOR,0,0);
pgSetWidget(PGDEFAULT,
PG_WP_SIDE,PG_S_ALL,
0);
/* Run it. */
pgSetIdle(1000,&sysIdle);
pgEventLoop();
return 0;
}
/* The End */

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
download/1.1/revol-1.1.zip Normal file

Binary file not shown.

50
download2.shtml Normal file
View File

@ -0,0 +1,50 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<!--#include virtual="header"-->
<font color="red"><b>Warning: Booting linux will erase all data
stored in RAM. If you have important files stored in your palmtop,
be sure to make copies of them first.</b></font>
<h3>Downloads</h3>
<ul>
<li> <b> 1.1 </b>
<ul>
<li> <a href="download/1.1/ChangeLog">ChangeLog</a>
<li> <a href="download/1.1/omnibar.c">omnibar.c</a> - modified omnibar source
<li> <a href="download/1.1/lcdtux.tar.gz">lcdtux.tar.gz</a> - lcdtux theme
</ul>
<i> Revo </i>
<ul>
<li> <a href="download/1.1/revol-1.1.sis.zip">revol-1.1.sis.zip</a> (zipped EPOC package)
<li> <a href="download/1.1/revol-1.1.tar.gz">revol-1.1.tar.gz</a>
<li> <a href="download/1.1/revol-1.1.zip">revol-1.1.zip</a>
</ul>
<i>Revo Plus</i>
<ul>
<li> <a href="download/1.1/revol-1.1-revoplus.sis.zip">revol-1.1-revoplus.sis.zip</a> (zipped EPOC package)
<li> <a href="download/1.1/revol-1.1-revoplus.tar.gz">revol-1.1-revoplus.tar.gz</a>
<li> <a href="download/1.1/revol-1.1-revoplus.zip">revol-1.1-revoplus.zip</a>
</ul>
<li> <b> 1.0 </b>
<ul>
<li> <a href="download/1.0/omnibar.c">omnibar.c</a> - modified omnibar source
<li> <a href="download/1.0/revol-1.0.sis.zip">revol-1.0.sis.zip</a> (zipped EPOC package)
<li> <a href="download/1.0/revol-1.0.tar.gz">revol-1.0.tar.gz</a>
<li> <a href="download/1.0/revol-1.0.zip">revol-1.0.zip</a>
</ul>
</ul>
<!--#include virtual="footer"-->
</html>

129
faq.shtml Normal file
View File

@ -0,0 +1,129 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<!--#include virtual="header" -->
<h3> FAQ </h3>
<ul>
<li> <b> Did you write this? </b>
<p>
Well, not really. Its related to <a href="http://psilinux.org/">Psilinux</a>
which is a project to port linux to Psions.
When I started, the port to the Revo was pretty much
complete, but no decent distribution existed for it (though there were
some for the Revo+).
The focus of Psilinux is on the 5MX, so
I put this distribution together to better support the Revo.
</p>
<li> <b> Can I keep all my existing files in EPOC while I try linux? </b>
<p>
Any files on your palmtop will be lost when you boot linux. It is advised
that you make backups of any essential files before you install. You will
need quite a bit of free space for the install, so you may have to delete
some files to install.
</p>
<li> <b> How can I change virtual terminal? </b>
<p>
The 'menu' key is generally the same as the 'alt' key on PC
keyboards. You can switch console by pressing menu-1,2,3 etc.
Similarly, pressing ctrl-menu-backspace equates to ctrl-alt-del
and will cause init to reboot the system.
</p>
<p>
Console 1 provides a default shell, you can start extra shells on
consoles 2-5. Consoles 9 and 10 show the syslog output and kernel
messages.
</p>
<li> <b> How do I type a pipe (|) ? </b>
<p>
Fn-T.
</p>
<li> <b> You always run as root! Dont you know this is bad practice? </b>
<p>
Maybe on desktop/server machines, but this is a PDA. I decided it was
pointless to bother with multiple users on a palmtop. If you damage
the system, you can simply install it again fairly quickly.
</p>
<li> <b> Why does the filesystem have a peculiar layout? </b>
<p>
I wanted to keep the filesystem simple so the layout is slightly different to
a normal linux distribution. I have tried to keep it generally similar to
the usual layout, however.
</p>
<li> <b> How do I start PicoGUI? </b>
<p>
From the console, type 'P'. This should automatically start PicoGUI.
</p>
<li> <b> How do I change the PicoGUI theme? </b>
<p>
Edit /etc/pgserver.conf and change the themes= line. There are several
themes to choose from in /pgui/themes.
</p>
<li> <b> How can I set up a serial connection to my desktop linux machine? </b>
<p>
There is a copy of pppd included which you can use to set up a PPP link
if you wish. However, I usually use the simpler SLIP protocol.
</p>
<p>
Firstly, on your desktop machine (you need SLIP support in the kernel
or the SLIP kernel modules loaded), execute the following commands as
root:
</p>
<pre>
slattach -s 115200 /dev/ttyS0 &
ifconfig sl0 10.0.2.1 pointopoint 10.0.2.2
</pre>
<p>
(This assumes the revo cradle is on COM1, substitute ttyS0 for your
serial port otherwise)
</p>
<p>
Next, on the Revo, simply execute /bin/connect. This performs similar
commands to the ones above to set up the link on the Revo side.
Hopefully, if the link is running you should be able to test the link
by pinging the revo (ip 10.0.2.2) from the desktop machine. You can
perform simple transfers between the desktop and revo using netcat
(nc).
</p>
<li> <b> Shouldnt this be called GNU/Linux? </b>
<p>
Actually, no. The argument for GNU/Linux is that most linux systems
are a modified version of the GNU system which has been around for
longer than linux has. However, Revol uses embedded versions of
the standard parts of the operating system normally provided
by GNU tools (uclibc instead of glibc, busybox instead of the GNU
fileutils etc). So Revol is a non-GNU linux system and it would be
incorrect to call it GNU/Linux.
</p>
</ul>
<!--#include virtual="footer" -->
</html>

7
footer Normal file
View File

@ -0,0 +1,7 @@
<hr>
<a href="mailto:fraggle@nospam.alkali.org">Simon Howard</a>. <br>
I am not associated with Psion Digital.
</body>

16
header Normal file
View File

@ -0,0 +1,16 @@
<head>
<title>Revol: Linux on the Psion Revo</title>
</head>
<body bgcolor="white" text="black" link="black" vlink="black">
<h1>Revol</h1>
<a href="index.shtml">Main</a> |
<a href="sshot.shtml">Screenshots</a> |
<a href="faq.shtml">FAQ</a> |
<a href="download.shtml">Downloads</a> |
<a href="links.shtml">Links</a> |
<a href="dev.shtml">Development Stuff</a> |
<a href="pkglist.shtml">Packages</a>
<hr>

44
index.shtml Normal file
View File

@ -0,0 +1,44 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<!--#include virtual="header"-->
<img align="right" src="revo.png" alt="Psion Revo">
<p>
Revol is a Linux Distribution for the Psion Revo.
</p>
<p>
Please note: this is designed for the original Revo, although it
runs on the Revo+ as well.
If you have a Revo+ or
a Diamond Mako, you may wish to try
<a href="http://zeniiia.linux.org.uk/pub/distributions/revo/revolinux.nm.ru/">
this distribution</a> instead which makes use of the extra memory to fit
some useful things in. It will probably not run on the 5MX. If you have
a 5MX, you may wish to try
<a href="http://www.psilinux.org/">the Psilinux project</a> which is
developing a distro.
</p>
<p>
Version 1.1 is <a href="download.shtml">available for download!</a>
I have managed to fit quite a few programs into the Revos memory.
Please feel free to try this out and send comments/suggestions/queries
to me.
</p>
<p>
Version 2.0 is under development and unlike previous versions will
be package based using <a href="spkg.shtml">spkg</a>. You can browse
a list of packages <a href="pkglist.shtml">here</a>.
</p>
<!--#include virtual="footer"-->
</html>

26
links.shtml Normal file
View File

@ -0,0 +1,26 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<!--#include virtual="header"-->
<h2> Links </h2>
<ul>
<li> <a href="http://www.picogui.org/">PicoGUI</a>
<li> <a href="http://www.psilinux.org/">PsiLinux</a>
<li> <a href="http://thomas.de-ruiter.cx/projects/psion/">Taders Psion 5mx Linux pages</a>
<li> <a href="http://revolinux.nm.ru/">Revo+ Linux</a>
<li> <a href="http://www.emdebian.org/">Embedded Debian</a>
<li> <a href="http://linux-7110.sourceforge.net/files/Kernels/5mx_and_Revo/">5mx kernel patch</a>
<li> <a href="http://uclibc.org/">uClibc</a>
<li> <a href="http://busybox.lineo.com/">Busybox</a>
</ul>
<!--#include virtual="footer"-->
</html>

246
omnibar.c Normal file
View File

@ -0,0 +1,246 @@
/* $Id: omnibar.c,v 1.2 2001/12/01 01:12:01 gork Exp $
*
* omnibar.c - hopefully this will grow into a general interface
* for starting and manipulating applications, but
* for now it's pretty simple.
*
* PicoGUI small and efficient client/server GUI
* Copyright (C) 2000 Micah Dowty <micahjd@users.sourceforge.net>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* Contributors:
*
*
*
*/
#include <sys/types.h> /* For making directory listings */
#include <dirent.h>
#include <sys/stat.h>
#include <time.h> /* For clock */
/* FIXME: Check for Mac OS X using autoconf */
#if (defined(__APPLE__) && defined(__MACH__)) // Mac OS X and Darwin
#include <sys/types.h>
#include <sys/malloc.h>
#else
#include <malloc.h>
#endif
#include <stdio.h> /* file IO for getting CPU load */
#include <picogui.h>
#include <unistd.h>
#ifdef CLOCK
pghandle wClock;
#endif
pghandle wLoad;
/********* Event handlers */
/* Applications menu
* This whole thing's a kludge, I will write
* something better (using custom menus) soon
*/
int btnAppMenu(struct pgEvent *evt) {
pghandle *items;
struct dirent *dent;
int i,l;
DIR *d;
d = opendir("/pgui/apps");
/* FIXME : Count the items and allocate the array */
items = alloca(sizeof(pghandle) * 40);
/* Enter a new context before making the handles */
pgEnterContext();
/* Make handles */
rewinddir(d);
i = 0;
while (dent = readdir(d)) {
/* Skip all but applications */
l = strlen(dent->d_name);
if (l<4) continue;
if (dent->d_name[0] == '.')
continue;
/* Add item */
items[i++] = pgNewString(dent->d_name);
}
/* Run it */
i = pgMenuFromArray(items,i);
/* Result? */
if (i) {
char buf[80]; /* FIXME: Buffer overflow 'sploit waiting to happen! */
strcpy(buf,"/pgui/apps/");
strcat(buf,pgGetString(items[i-1]));
if (!vfork()) {
execlp(buf,buf,NULL);
pgMessageDialogFmt("Error",0,"There was an error starting the\nfollowing program:\n%s",buf);
exit(1);
}
}
/* Free the server memory and destroy our menu */
pgLeaveContext();
closedir(d);
return 0;
}
/* System menu */
int btnSysMenu(struct pgEvent *evt) {
switch (pgMenuFromString("About PicoGUI...|About Revol...|Quit PicoGUI...")) {
case 1:
/* Quick little about box */
pgMessageDialog("About PicoGUI",
"Welcome to PicoGUI!\n"
"This is a preview release (or a development\n"
"version if you're a developer :)\n"
"What you see may or may not represent the\n"
"future of PicoGUI, it is just a test.\n"
"For more information and the latest code, visit:\n"
" http://pgui.sourceforge.net\n"
"\n"
"-- Micah",0);
break;
case 2:
pgMessageDialog("About Revol",
"Revol: Linux on the Psion Revo\n"
"\n"
"By Simon Howard\n"
"\n"
"http://fraggle.alkali.org/stuffage/revol/\n"
"Feedback: sdh300@ecs.soton.ac.uk\n", 0);
break;
case 3:
/* Beam us out! */
if (pgMessageDialog("Quit PicoGUI", "Quit PicoGUI?",
PG_MSGBTN_YES | PG_MSGBTN_NO)==PG_MSGBTN_YES)
exit(0);
}
}
/* Called to update the clock and system load indicators */
void sysIdle(void) {
time_t now;
char *ct;
char buf[50];
FILE *f;
unsigned long cpu_user,cpu_nice,cpu_sys,cpu_idle;
unsigned long crun,ctotal;
static unsigned long ocrun = 0,octotal = 1;
#ifdef CLOCK
/* Get time */
time(&now);
ct = ctime(&now);
ct[strlen(ct)-1] = 0; /* Strip newline */
pgReplaceText(wClock,ct);
pgSubUpdate(wClock);
#endif
/* Get CPU load */
f = fopen("/proc/stat","r");
fgets(buf,50,f);
fclose(f);
sscanf(buf,"cpu %lu %lu %lu %lu",&cpu_user,&cpu_nice,&cpu_sys,&cpu_idle);
crun = cpu_user + cpu_sys;
ctotal = crun + cpu_nice + cpu_idle;
if (crun==ocrun || ctotal==octotal) return; /* Prevent SIGFPE */
pgSetWidget(wLoad,PG_WP_VALUE, (crun-ocrun) * 100 / (ctotal-octotal),0);
ocrun = crun;
octotal = ctotal;
pgSubUpdate(wLoad);
}
/********* Main program */
int main(int argc, char **argv) {
pghandle wLoadbox,fntLabel,fntLabelBold;
pgInit(argc,argv);
pgRegisterApp(PG_APP_TOOLBAR,"OmniBar",0);
/* A font for our labels */
fntLabel = pgNewFont(NULL,10,PG_FSTYLE_FIXED);
fntLabelBold = pgNewFont("Helvetica",8,PG_FSTYLE_BOLD);
/* Top-level widgets */
pgNewWidget(PG_WIDGET_BUTTON,0,0);
pgSetWidget(PGDEFAULT,
PG_WP_TEXT,pgNewString("Applications"),
PG_WP_EXTDEVENTS,PG_EXEV_PNTR_DOWN,
0);
pgBind(PGDEFAULT,PG_WE_PNTR_DOWN,&btnAppMenu,NULL);
pgNewWidget(PG_WIDGET_BUTTON,0,0);
pgSetWidget(PGDEFAULT,
PG_WP_TEXT,pgNewString("System"),
PG_WP_EXTDEVENTS,PG_EXEV_PNTR_DOWN,
0);
pgBind(PGDEFAULT,PG_WE_PNTR_DOWN,&btnSysMenu,NULL);
#ifdef CLOCK
wClock = pgNewWidget(PG_WIDGET_LABEL,0,0);
pgSetWidget(PGDEFAULT,
PG_WP_SIDE,PG_S_RIGHT,
PG_WP_FONT,fntLabel,
PG_WP_TRANSPARENT,0,
0);
#endif
wLoadbox = pgNewWidget(PG_WIDGET_BOX,0,0);
pgSetWidget(PGDEFAULT,
PG_WP_SIDE,PG_S_RIGHT,
PG_WP_SIZE,200,
0);
/* Inside the load box */
pgNewWidget(PG_WIDGET_LABEL,PG_DERIVE_INSIDE,wLoadbox);
pgSetWidget(PGDEFAULT,
PG_WP_TEXT,pgNewString("CPU"),
PG_WP_SIDE,PG_S_RIGHT,
PG_WP_FONT,fntLabel,
0);
wLoad = pgNewWidget(PG_WIDGET_INDICATOR,0,0);
pgSetWidget(PGDEFAULT,
PG_WP_SIDE,PG_S_ALL,
0);
/* Run it. */
pgSetIdle(1000,&sysIdle);
pgEventLoop();
return 0;
}
/* The End */

BIN
picotone-0.1.tar.gz Normal file

Binary file not shown.

BIN
picotone-0.2.0.tar.gz Normal file

Binary file not shown.

30
picotone.shtml Normal file
View File

@ -0,0 +1,30 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<!--#include virtual="header"-->
<h2> PicoTone </h2>
<p>
This is a small PicoGUI DTMF tone dialer that you can use to dial numbers
on phones with touch tone exchanges.
</p>
<center><img src="sshot/picotone.png"></center>
<h3>Download</h3>
<ul>
<li> <b> v0.2.0</b>
<ul>
<li> <a href="picotone-0.2.0.tar.gz">v0.2.0</a>
</ul>
</ul>
<!--#include virtual="footer"-->
</html>

129
pkglist Executable file
View File

@ -0,0 +1,129 @@
#!/usr/bin/perl -w
use strict;
use CGI qw(param);
my %packages;
my $pkgdir="spkg/unstable";
my $pkgpage="pkglist.shtml";
my $package_file = "Packages";
# get md5sum of a file
sub packages_load {
my $thispkg = {};
$thispkg->{depends} = [];
open(PACKAGES, "$pkgdir/$package_file")
or die("Cant open packages file");
while (<PACKAGES>) {
chomp;
if ($_ eq '' && $thispkg->{name}) {
bless $thispkg;
$packages{$thispkg->{name}} = $thispkg;
$thispkg = {};
$thispkg->{depends} = [];
} elsif (/^\w+\:/) {
my ($var, $val) = /^(\w+)\:\s*(.*)/;
if ($var eq 'Package') {
$thispkg->{name} = $val;
} elsif ($var eq 'Filename') {
$thispkg->{file} = $val;
} elsif ($var eq 'Version') {
$thispkg->{version} = $val;
} elsif ($var eq 'MD5sum') {
$thispkg->{md5} = $val;
} elsif ($var eq 'Size') {
$thispkg->{filesize} = $val;
} elsif ($var eq 'Description') {
if ($thispkg->{description}) {
$thispkg->{longdesc} .= "$val\n";
} else {
$thispkg->{description} = $val;
}
} elsif ($var eq 'Depend') {
my $deppkg = $packages{$val};
my $depends = $thispkg->{depends};
if (!$deppkg) {
die "package not found: $val\n";
}
push @$depends, $deppkg;
} else {
die "Invalid field: $var\n";
}
}
}
if ($thispkg->{name}) {
$packages{$thispkg->{name}} = $thispkg;
}
close(PACKAGES);
}
sub pkg_param {
my ($desc, $name, $pkg) = @_;
return if !$pkg->{$name};
print "<b>$desc:</b> $pkg->{$name} <br>\n";
}
packages_load;
if (param('pkg')) {
my $pkg = $packages{param('pkg')};
die "package not found" if !$pkg;
print "<h2>$pkg->{name}</h2>\n";
pkg_param('Version', 'version', $pkg);
if ($pkg->{file}) {
print "<b>File:</b> ";
print "<a href=\"$pkgdir/$pkg->{file}\">$pkg->{file}</a>";
print "<br>\n";
}
pkg_param('File Size', 'filesize', $pkg);
pkg_param('File MD5SUM', 'md5', $pkg);
pkg_param('Description', 'description', $pkg);
print $pkg->{longdesc} if $pkg->{longdesc};
my $depends = $pkg->{depends};
if (scalar @$depends > 0) {
print "<h3>Dependencies</h3>\n";
print "<ul>\n";
foreach (@$depends) {
print "<li> ";
print "<a href=\"$pkgpage?pkg=$_->{name}\">";
print "$_->{name}</a>\n";
}
print "</ul>\n";
}
print "<p> <a href=\"$pkgpage\">back</a>\n";
} else {
print "<h2>Packages</h2>\n";
print "The next version of Revol will be package based, using ";
print "<a href=\"spkg.shtml\">spkg</a> to build filesystems automatically. ";
print "This is a list of packages currently available in the ";
print "<a href=\"$pkgdir/\">repository</a>.";
print "<ul>\n";
foreach(sort(keys %packages)) {
print "<li> ";
print "<a href=\"$pkgpage?pkg=$_\">$_</a>\n";
}
print "</ul>\n";
}

13
pkglist.shtml Normal file
View File

@ -0,0 +1,13 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<!--#include virtual="header"-->
<!--#exec cmd="./pkglist" -->
<!--#include virtual="footer"-->
</html>

BIN
psionconf-1.0.0.tar.gz Normal file

Binary file not shown.

34
psionconf.2.shtml Normal file
View File

@ -0,0 +1,34 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<!--#include virtual="header"-->
<h2> Psionconf </h2>
<p>
This is a small PicoGUI application to control various Psion Linux settings.
</p>
<center><img src="sshot/psionconf3.png"></center>
<p align="right"
<a href="/cgi-bin/showstats.cgi?fraggle-psionconf">
<!--#include virtual="/cgi-bin/stats.cgi?fraggle-psionconf"-->
</a>
</p>
<h3>Download</h3>
<ul>
<li> <b> v1.0.0</b>
<ul>
<li> <a href="psionconf-1.0.0.tar.gz">psionconf-1.0.0.tar.gz</a>
</ul>
</ul>
<!--#include virtual="footer"-->
</html>

29
psionconf.shtml Normal file
View File

@ -0,0 +1,29 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<!--#include virtual="header"-->
<h2> Psionconf </h2>
<p>
This is a small PicoGUI application to control various Psion Linux settings.
</p>
<center><img src="sshot/psionconf3.png"></center>
<h3>Download</h3>
<ul>
<li> <b> v1.0.0</b>
<ul>
<li> <a href="psionconf-1.0.0.tar.gz">psionconf-1.0.0.tar.gz</a>
</ul>
</ul>
<!--#include virtual="footer"-->
</html>

BIN
revo.2.png Normal file

Binary file not shown.

After

(image error) Size: 40 KiB

BIN
revo.jpg Normal file

Binary file not shown.

After

(image error) Size: 22 KiB

BIN
revo.png Normal file

Binary file not shown.

After

(image error) Size: 40 KiB

42
spkg.shtml Normal file
View File

@ -0,0 +1,42 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<!--#include virtual="header"-->
<h2> Shonky Package Manager </h2>
<p>
spkg is a small package management system I have written for Revol. It
works as a "cross compiled" package system. Whereas most package managers
run on their target system, this builds the root filesystem automatically
on a host system. It is written in perl and is in some ways inspired by
debians dpkg.
</p>
<p>
I plan to use this system as the base for the next version of Revol.
</p>
<p align="right"
<a href="/cgi-bin/showstats.cgi?fraggle-spkg">
<!--#include virtual="/cgi-bin/stats.cgi?fraggle-spkg"-->
</a>
</p>
<a href="http://freshmeat.net/projects/spkg/">freshmeat page</a>
<h3>Download</h3>
<ul>
<li> <b> v0.9</b>
<ul>
<li> <a href="spkg/spkg-0.9.tar.gz">spkg-0.9.tar.gz</a>
</ul>
</ul>
<!--#include virtual="footer"-->
</html>

BIN
spkg/spkg-0.9.tar.gz Normal file

Binary file not shown.

127
spkg/unstable/Packages Normal file
View File

@ -0,0 +1,127 @@
Package: basesystem
Filename: basesystem-2.0.tar.gz
MD5sum: a52e66e552085985630c596884cff749
Size: 2819
Description: Base file system files
Version: 2.0
Package: uclibc
Filename: uclibc-cvs020321.tar.gz
MD5sum: f3b2344e894beda71cfdc15a6c467150
Size: 154328
Description: The uClibc C library
Description: The uClibc C library is a small C library for embedded systems.
Description: See http://www.uclibc.org/
Version: cvs020321
Package: busybox
Filename: busybox-0.62.2.tar.gz
MD5sum: 0e1a2a905af594b3701e9522d8324265
Size: 114704
Description: The Swiss Army Knife of Embedded Linux
Description: BusyBox combines tiny versions of many common UNIX utilities
Description: into a single small executable.
Description: See http://www.busybox.net/
Version: 0.62.2
Package: picogui
Filename: picogui-cvs021009.tar.gz
MD5sum: 0be451aa224b7bcbf9437de5b78064d8
Size: 237465
Description: The PicoGUI window system.
Description: PicoGUI is a small flexible GUI originally designed for
Description: use on embedded systems.
Version: cvs021009
Package: picogui-games
Filename: picogui-games-cvs021009.tar.gz
MD5sum: 28cfe02f4762f2442daa6ef01a0dce2a
Size: 8792
Description: A small collection of games for PicoGUI
Depend: picogui
Version: cvs021009
Package: picogui-utils
Filename: picogui-utils-cvs021009.tar.gz
MD5sum: 5744515d6d57b0f5b3a3c9c5d8ed6629
Size: 9558
Description: Some small utilities for PicoGUI
Depend: picogui
Version: cvs021009
Package: picogui-themes
Filename: picogui-themes-cvs021009.tar.gz
MD5sum: 502ab63865a82b55150fd38a90db4a36
Size: 23225
Description: Some extra themes for picogui
Depend: picogui
Version: cvs021009
Package: psionconf
Filename: psionconf-1.0.0.tar.gz
MD5sum: 35989ed9e4ff22654654c041759b7d61
Size: 8003
Description: Psilinux config utility for PicoGUI
Depend: picogui
Version: 1.0.0
Package: sopwith
Filename: sopwith-1.5.0.tar.gz
MD5sum: 7be25c6e913b2d4219fcbc64cadda4e7
Size: 33025
Description: Classic biplane shoot 'em up
Version: 1.5.0
Package: irattach
Filename: irattach-0.9.13.tar.gz
MD5sum: 0e295be75da3daeef4336343367fa371
Size: 4635
Description: IrDA attach util
Description: From the irdautils package.
Version: 0.9.13
Package: slattach
Filename: slattach-1.60.tar.gz
MD5sum: 80c0a494c4f4b99ef9eae0c1057e2474
Size: 6768
Description: slattach for SLIP connections
Description: From the net-tools package.
Version: 1.60
Package: picotone
Filename: picotone-0.2.0.tar.gz
MD5sum: b59f6d7962038b4f70850d46250fc882
Size: 3461
Description: A small DTMF tone dialer for PicoGUI
Depend: picogui
Version: 0.2.0
Package: termcap
Filename: termcap-2.0.8.tar.gz
MD5sum: 71a09ce62a32fa6a5d91bc9ad2673a4e
Size: 7195
Description: The termcap library providing an API for terminal access
Version: 2.0.8
Package: microemacs
Filename: microemacs-0212.tar.gz
MD5sum: a5e24114a48a5a44bfc46beb7ec14103
Size: 248774
Description: Microemacs is a tiny version of the Emacs text editor
Depend: termcap
Version: 0212
Package: netcat
Filename: netcat-1.10.tar.gz
MD5sum: 8a28373b9c046811bf5ad22ce1fce3f8
Size: 9353
Description: netcat network piping utility
Version: 1.10
Package: tictac
Filename: tictac-0.5.tar.gz
MD5sum: 71083fbafd40017ee5a5fac6d2c65144
Size: 2282
Description: tic-tac-toe
Version: 0.5

View File

@ -0,0 +1,95 @@
Package: basesystem
Filename: basesystem-2.0.tar.gz
Description: Base file system files
Version: 2.0
Package: uclibc
Filename: uclibc-cvs020321.tar.gz
Description: The uClibc C library
Description: The uClibc C library is a small C library for embedded systems.
Description: See http://www.uclibc.org/
Version: cvs020321
Package: busybox
Filename: busybox-0.62.2.tar.gz
Description: The Swiss Army Knife of Embedded Linux
Description: BusyBox combines tiny versions of many common UNIX utilities
Description: into a single small executable.
Description: See http://www.busybox.net/
Version: 0.62.2
Package: picogui
Filename: picogui-cvs021009.tar.gz
Description: The PicoGUI window system.
Description: PicoGUI is a small flexible GUI originally designed for
Description: use on embedded systems.
Version: cvs021009
Package: picogui-games
Filename: picogui-games-cvs021009.tar.gz
Description: A small collection of games for PicoGUI
Depend: picogui
Version: cvs021009
Package: picogui-utils
Filename: picogui-utils-cvs021009.tar.gz
Description: Some small utilities for PicoGUI
Depend: picogui
Version: cvs021009
Package: picogui-themes
Filename: picogui-themes-cvs021009.tar.gz
Description: Some extra themes for picogui
Depend: picogui
Version: cvs021009
Package: psionconf
Filename: psionconf-1.0.0.tar.gz
Description: Psilinux config utility for PicoGUI
Depend: picogui
Version: 1.0.0
Package: sopwith
Filename: sopwith-1.5.0.tar.gz
Description: Classic biplane shoot 'em up
Version: 1.5.0
Package: irattach
Filename: irattach-0.9.13.tar.gz
Description: IrDA attach util
Description: From the irdautils package.
Version: 0.9.13
Package: slattach
Filename: slattach-1.60.tar.gz
Description: slattach for SLIP connections
Description: From the net-tools package.
Version: 1.60
Package: picotone
Filename: picotone-0.2.0.tar.gz
Description: A small DTMF tone dialer for PicoGUI
Depend: picogui
Version: 0.2.0
Package: termcap
Filename: termcap-2.0.8.tar.gz
Description: The termcap library providing an API for terminal access
Version: 2.0.8
Package: microemacs
Filename: microemacs-0212.tar.gz
Description: Microemacs is a tiny version of the Emacs text editor
Depend: termcap
Version: 0212
Package: netcat
Filename: netcat-1.10.tar.gz
Description: netcat network piping utility
Version: 1.10
Package: tictac
Filename: tictac-0.5.tar.gz
Description: tic-tac-toe
Version: 0.5

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

41
spkg/unstable/packages.pl Executable file
View File

@ -0,0 +1,41 @@
#!/usr/bin/perl
#
sub get_md5sum {
my ($filename) = @_;
open(MD5PIPE, "md5sum $filename |");
my $sum = <MD5PIPE>;
chomp $sum;
close(MD5PIPE);
die if !$sum;
$sum =~ s/\s.*$//;
return $sum;
}
open(PKGIN, "Packages.human") or die;
open(PKGOUT, ">Packages") or die;
while (<PKGIN>) {
print PKGOUT $_;
chomp;
if (/^Filename\:/) {
my ($filename) = /^Filename\:\s*(.*)/;
die "$filename does not exist!" if !-e $filename;
my @filestat = stat($filename);
print PKGOUT "MD5sum: " . get_md5sum($filename) . "\n";
print PKGOUT "Size: " . $filestat[7] . "\n";
}
}
close(PKGOUT);
close(PKGIN);

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

60
sshot.shtml Normal file
View File

@ -0,0 +1,60 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<!--#include virtual="header"-->
<h2> Screenshots </h2>
<img src="sshot/picogui.png" alt="picogui"> <br>
<p>
PicoGUI running on the Revo
</p>
<img src="sshot/battleship.png" alt="battleship"> <br>
<p>
Playing PicoGUI battleship
</p>
<img src="sshot/aqua.png" alt="aqua theme"> <br>
<p>
PicoGUI using the aqua theme
</p>
<img src="sshot/bx.png" alt="BitchX"> <br>
<p>
Logged on to a remote machine and using BitchX
</p>
<img src="sshot/pine.png" alt="pine"> <br>
<p>
Logged on to a remote machine and using pine to read mail
</p>
<img src="sshot/omnibar.png" alt="omnibar"> <br>
<p>
Omnibar running with a menu open showing the list of installed
programs.
</p>
<img src="sshot/sopwith5.png" alt="sopwith">
<p>
I ported <a href="http://fraggle.despayre.org:81/stuffage/sopwith/">
Sopwith</a> to the revo framebuffer
</p>
<img src="sshot/emacs.png" alt="emacs">
<p>
This is <a href="http://www.jasspa.com/">microemacs</a> running in a
PicoGUI pterm window.
</p>
<p>
<a href="sshot/">more random screenshots</a>
</p>
<!--#include virtual="footer"-->
</html>

BIN
sshot/aqua.png Normal file

Binary file not shown.

After

(image error) Size: 2.7 KiB

BIN
sshot/battleship.png Normal file

Binary file not shown.

After

(image error) Size: 1.8 KiB

BIN
sshot/bx.png Normal file

Binary file not shown.

After

(image error) Size: 4.6 KiB

BIN
sshot/emacs.png Normal file

Binary file not shown.

After

(image error) Size: 1.6 KiB

BIN
sshot/fluidity.png Normal file

Binary file not shown.

After

(image error) Size: 2.0 KiB

BIN
sshot/font_oops.png Normal file

Binary file not shown.

After

(image error) Size: 1.5 KiB

BIN
sshot/garbled.png Normal file

Binary file not shown.

After

(image error) Size: 1.7 KiB

37
sshot/index.html Normal file
View File

@ -0,0 +1,37 @@
<html>
<body>
<img src='aqua.png'><br>
<img src='battleship.png'><br>
<img src='bx.png'><br>
<img src='emacs.png'><br>
<img src='fluidity.png'><br>
<img src='font_oops.png'><br>
<img src='garbled.png'><br>
<img src='link1.png'><br>
<img src='link2.png'><br>
<img src='link3.png'><br>
<img src='mp3blaster.png'><br>
<img src='omnibar.png'><br>
<img src='ouch.png'><br>
<img src='picogui.png'><br>
<img src='picotone.png'><br>
<img src='pine.png'><br>
<img src='psionconf.png'><br>
<img src='psionconf2.png'><br>
<img src='psionconf3.png'><br>
<img src='pterm_bx.png'><br>
<img src='pterm_bx2.png'><br>
<img src='revoblah.png'><br>
<img src='sopwith1.png'><br>
<img src='sopwith2.png'><br>
<img src='sopwith3.png'><br>
<img src='sopwith4.png'><br>
<img src='sopwith5.png'><br>
<img src='sopwith6.png'><br>
<img src='sopwith_wide.png'><br>
<img src='telnet_insecure.png'><br>
<img src='tictac.png'><br>
</body>
</html>

BIN
sshot/link1.png Normal file

Binary file not shown.

After

(image error) Size: 6.3 KiB

BIN
sshot/link2.png Normal file

Binary file not shown.

After

(image error) Size: 23 KiB

BIN
sshot/link3.png Normal file

Binary file not shown.

After

(image error) Size: 15 KiB

BIN
sshot/mp3blaster.png Normal file

Binary file not shown.

After

(image error) Size: 1.7 KiB

BIN
sshot/omnibar.png Normal file

Binary file not shown.

After

(image error) Size: 865 B

BIN
sshot/ouch.png Normal file

Binary file not shown.

After

(image error) Size: 1.6 KiB

BIN
sshot/picogui.png Normal file

Binary file not shown.

After

(image error) Size: 2.1 KiB

BIN
sshot/picotone.png Normal file

Binary file not shown.

After

(image error) Size: 2.8 KiB

BIN
sshot/pine.png Normal file

Binary file not shown.

After

(image error) Size: 3.5 KiB

BIN
sshot/psionconf.png Normal file

Binary file not shown.

After

(image error) Size: 2.9 KiB

BIN
sshot/psionconf2.png Normal file

Binary file not shown.

After

(image error) Size: 3.0 KiB

BIN
sshot/psionconf3.png Normal file

Binary file not shown.

After

(image error) Size: 3.6 KiB

BIN
sshot/pterm_bx.png Normal file

Binary file not shown.

After

(image error) Size: 4.1 KiB

BIN
sshot/pterm_bx2.png Normal file

Binary file not shown.

After

(image error) Size: 4.0 KiB

BIN
sshot/revoblah.png Normal file

Binary file not shown.

After

(image error) Size: 1.5 KiB

BIN
sshot/sopwith1.png Normal file

Binary file not shown.

After

(image error) Size: 2.1 KiB

BIN
sshot/sopwith2.png Normal file

Binary file not shown.

After

(image error) Size: 1.1 KiB

BIN
sshot/sopwith3.png Normal file

Binary file not shown.

After

(image error) Size: 869 B

BIN
sshot/sopwith4.png Normal file

Binary file not shown.

After

(image error) Size: 2.0 KiB

BIN
sshot/sopwith5.png Normal file

Binary file not shown.

After

(image error) Size: 771 B

BIN
sshot/sopwith6.png Normal file

Binary file not shown.

After

(image error) Size: 996 B

BIN
sshot/sopwith_wide.png Normal file

Binary file not shown.

After

(image error) Size: 1.1 KiB

BIN
sshot/telnet_insecure.png Normal file

Binary file not shown.

After

(image error) Size: 2.2 KiB

BIN
sshot/tictac.png Normal file

Binary file not shown.

After

(image error) Size: 1.0 KiB