2009-06-22 17:13:00 +03:00
#pypp 0
2009-06-24 01:47:13 +03:00
// Iris: micro-kernel for a capability-based operating system.
// boot-programs/devices.hhp: interfaces for core devices.
// Copyright 2009 Bas Wijnen <wijnen@debian.org>
//
// 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 3 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, see <http://www.gnu.org/licenses/>.
2009-06-22 17:13:00 +03:00
#ifndef __IRIS_DEVICES_HH
#define __IRIS_DEVICES_HH
2009-08-18 00:11:15 +03:00
#include "iris.hh"
2009-07-27 21:03:58 +03:00
2009-08-18 00:11:15 +03:00
// List interface.
template <typename _T> //
2009-09-06 12:04:09 +03:00
struct List : public Kernel::Cap:
List (Kernel::Cap c = Kernel::Cap ()) : Kernel::Cap (c):
2009-08-18 00:11:15 +03:00
// TODO
2009-07-27 21:03:58 +03:00
2009-09-06 12:04:09 +03:00
struct String : public Kernel::Cap:
String (Kernel::Cap c = Kernel::Cap ()) : Kernel::Cap (c):
2009-08-18 00:11:15 +03:00
// TODO
2009-07-27 21:03:58 +03:00
2009-08-18 00:11:15 +03:00
// Keyboard interface.
2009-09-06 12:04:09 +03:00
struct Keyboard : public Kernel::Cap:
Keyboard (Kernel::Cap c = Kernel::Cap ()) : Kernel::Cap (c):
2009-08-18 00:11:15 +03:00
enum request:
2009-09-06 12:04:09 +03:00
SET_CB = 1
2009-08-18 00:11:15 +03:00
GET_KEYS
// At event: the callback is called with a keycode. One bit defines if it's a press or release event.
enum constant:
RELEASE = 1 << 31
// Set the event callback. Currently pressed keys emit a key press event to the new callback immediately, plus a ~0 to signal the end of such events.
2009-09-06 12:04:09 +03:00
void set_cb (Kernel::Cap cb):
2009-08-24 22:02:35 +03:00
ocall (cb, CAP_MASTER_DIRECT | SET_CB)
2009-08-18 00:11:15 +03:00
// Get a list of keys on this keyboard. The key codes start at zero with no gaps.
2009-09-06 12:04:09 +03:00
List <String> get_keys ():
icall (CAP_MASTER_DIRECT | GET_KEYS)
return Kernel::get_arg ()
2009-07-27 21:03:58 +03:00
// Display interface.
2009-09-06 12:04:09 +03:00
struct Display : public Kernel::Cap:
Display (Kernel::Cap c = Kernel::Cap ()) : Kernel::Cap (c):
2009-08-18 00:11:15 +03:00
enum request:
2009-09-06 12:04:09 +03:00
EOF_CB = 1
2009-08-18 00:11:15 +03:00
CREATE_FB
USE_FB
GET_INFO
// Register an end-of-frame callback.
// At end of frame, the callback is invoked and forgotten. It must be reregistered to keep a stream of events.
2009-09-06 12:04:09 +03:00
void set_eof_cb (Kernel::Cap cb):
2009-08-24 22:02:35 +03:00
ocall (cb, CAP_MASTER_DIRECT | EOF_CB)
2009-08-18 00:11:15 +03:00
// Create a framebuffer for the display. When not in use, it can be freed by the user.
// The pages must be cappages holding Page capabilities. They are filled by the display.
// The passed numbers must be 0 or match a mode that the device can use.
// The returned number is the physical address of the framebuffer. It can be used with display_use_framebuffer.
2009-09-06 12:04:09 +03:00
unsigned create_framebuffer (unsigned w = 0, unsigned h = 0, unsigned mode = 0):
return icall (Kernel::Num (CAP_MASTER_DIRECT | CREATE_FB, 0), Kernel::Num ((w << 16) | h, mode)).l
2009-08-18 00:11:15 +03:00
// Use a framebuffer. The address must have been returned from display_create_framebuffer.
// w, h and mode must match the values given at creation time.
// unuse_cb is called the next time this operation is requested for this display.
2009-09-06 12:04:09 +03:00
void use_framebuffer (unsigned addr, Kernel::Cap unuse_cb = Kernel::Cap (), unsigned w = 0, unsigned h = 0, unsigned mode = 0):
ocall (unuse_cb, Kernel::Num (CAP_MASTER_DIRECT | USE_FB, addr), Kernel::Num ((w << 16) | h, mode))
2009-08-18 00:11:15 +03:00
// Get information about the display.
void get_info ():
// TODO: Interface is to be designed.
2009-07-27 21:03:58 +03:00
// File system interface.
2009-08-18 00:11:15 +03:00
// filesystem-related interfaces: file, directory, stream, seekable, mappable.
// Normal files implement at least stream or seekable file. Directories implement directory.
2009-09-06 12:04:09 +03:00
struct File : public Kernel::Cap:
File (Kernel::Cap c = Kernel::Cap ()) : Kernel::Cap (c):
2009-08-18 00:11:15 +03:00
enum request:
2009-09-06 12:04:09 +03:00
INFO = 1
2009-08-18 00:11:15 +03:00
CLOSE
MAP_HANDLE
// Get information about the file.
2009-09-06 12:04:09 +03:00
Kernel::Num get_info (unsigned type):
return icall (Kernel::Num (CAP_MASTER_DIRECT | INFO, type))
2009-08-18 00:11:15 +03:00
// Close a file. If this is a directory, it implicitly closes all files opened from it.
void close ():
2009-08-24 22:02:35 +03:00
call (CAP_MASTER_DIRECT | CLOSE)
2009-08-18 00:11:15 +03:00
// Map a file handle. This can be useful for closing all children at once. The new handle itself is a child of the original handle.
2009-09-06 12:04:09 +03:00
File map_handle ():
icall (CAP_MASTER_DIRECT | MAP_HANDLE)
return Kernel::get_arg ()
2009-07-27 21:03:58 +03:00
// Directory interface.
2009-08-18 00:11:15 +03:00
struct Directory : public File:
2009-09-06 12:04:09 +03:00
Directory (Kernel::Cap c = Kernel::Cap ()) : File (c):
2009-08-18 00:11:15 +03:00
enum request:
2009-09-06 12:04:09 +03:00
GET_SIZE = 1
2009-08-18 00:11:15 +03:00
GET_NAME
GET_FILE
GET_FILE_INFO
CREATE_FILE
DELETE_FILE
// Get the number of entries in this directory.
2009-09-06 12:04:09 +03:00
Kernel::Num get_size ():
2009-08-18 00:11:15 +03:00
return call (CAP_MASTER_DIRECT | GET_SIZE)
// Get the filename. The return value is the size of the string, the page is filled with the string itself.
2009-09-06 12:04:09 +03:00
String get_name (Kernel::Num idx):
icall (CAP_MASTER_DIRECT | GET_NAME, idx)
return Kernel::get_arg ()
2009-08-18 00:11:15 +03:00
// Get the file.
2009-09-06 12:04:09 +03:00
File get_file (Kernel::Num idx):
icall (CAP_MASTER_DIRECT | GET_FILE, idx)
return Kernel::get_arg ()
2009-08-18 00:11:15 +03:00
// Get file info. This returns the same information as file_get_info, without opening the file.
2009-09-06 12:04:09 +03:00
Kernel::Num get_file_info (Kernel::Num idx, unsigned type):
return icall (Kernel::Num (CAP_MASTER_DIRECT | GET_FILE_INFO, type), idx)
2009-08-18 00:11:15 +03:00
// Create a new file. After this, any index may map to a different file.
2009-09-06 12:04:09 +03:00
File create_file (String name):
icall (CAP_MASTER_DIRECT | CREATE_FILE)
return Kernel::get_arg ()
2009-08-18 00:11:15 +03:00
// Delete a file. After this, any index may map to a different file.
2009-09-06 12:04:09 +03:00
void delete_file (Kernel::Num idx):
2009-08-24 22:02:35 +03:00
call (CAP_MASTER_DIRECT | DELETE_FILE, idx)
2009-07-27 21:03:58 +03:00
// Stream interface.
2009-08-18 00:11:15 +03:00
struct Stream : public File:
2009-09-06 12:04:09 +03:00
Stream (Kernel::Cap c = Kernel::Cap ()) : File (c):
2009-08-18 00:11:15 +03:00
enum request:
2009-09-06 12:04:09 +03:00
READ = 1
2009-08-18 00:11:15 +03:00
WRITE
// Try to read size bytes. Returns the number of bytes successfully read.
2009-09-06 12:04:09 +03:00
Kernel::Num read (Kernel::Num size):
return icall (CAP_MASTER_DIRECT | READ, size)
2009-08-18 00:11:15 +03:00
// Try to write size bytes. Returns the number of bytes successfully written.
2009-09-06 12:04:09 +03:00
Kernel::Num write (String s, Kernel::Num size):
2009-08-24 22:02:35 +03:00
return ocall (s, CAP_MASTER_DIRECT | WRITE, size)
2009-07-27 21:03:58 +03:00
// Seekable file interface.
2009-08-18 00:11:15 +03:00
struct Seekable : public File:
2009-09-06 12:04:09 +03:00
Seekable (Kernel::Cap c = Kernel::Cap ()) : File (c):
2009-08-18 00:11:15 +03:00
enum request:
2009-09-06 12:04:09 +03:00
READ = 1
2009-08-18 00:11:15 +03:00
WRITE
TRUNCATE
// Try to read size bytes from position idx. Returns the number of bytes successfully read.
2009-09-06 12:04:09 +03:00
Kernel::Num read (Kernel::Num idx, unsigned size):
return icall (Kernel::Num (CAP_MASTER_DIRECT | READ, size), idx)
2009-08-18 00:11:15 +03:00
// Try to write size bytes at position idx; the file is extended with zeroes if the write is past the end. Returns the number of bytes successfully written.
2009-09-06 12:04:09 +03:00
Kernel::Num write (Kernel::Num idx, String s):
2009-08-24 22:02:35 +03:00
return ocall (s, CAP_MASTER_DIRECT | WRITE, idx)
2009-08-18 00:11:15 +03:00
// Truncate file to size idx. The file is extended with zeroes if it gets longer.
2009-09-06 12:04:09 +03:00
void truncate (Kernel::Num idx):
2009-08-24 22:02:35 +03:00
call (CAP_MASTER_DIRECT | TRUNCATE, idx)
2009-07-27 21:03:58 +03:00
// Mappable file interface.
2009-08-18 00:11:15 +03:00
struct Mappable : public Seekable:
2009-09-06 12:04:09 +03:00
Mappable (Kernel::Cap c = Kernel::Cap ()) : Seekable (c):
2009-08-18 00:11:15 +03:00
// TODO: to be designed.
2009-07-27 21:03:58 +03:00
// Block device interface.
2009-08-18 00:11:15 +03:00
struct Block_device : public Mappable:
2009-09-06 12:04:09 +03:00
Block_device (Kernel::Cap c = Kernel::Cap ()) : Mappable (c):
2009-08-18 00:11:15 +03:00
// TODO: to be designed.
2009-07-27 21:03:58 +03:00
// TODO.
// Sound interface.
// Usb interfaces (port, device).
// Pointer interface. (Only movement; buttons follow keyboard interface.)
// Network interface.
// Camera interface.
// Terminal interfaces.
2009-06-22 17:13:00 +03:00
#endif