RADPx-OS Kernel (Radical Posix OS)  Crimson 0.1.4
POSIX-inspired kernel API with embedded and desktop VM targets
Minimal Examples

These examples show the intended public API shape. They omit platform-specific register setup and error logging for clarity.

Register A Kernel Module

static rad_status_t my_driver_init(void *context) {
(void)context;
return RAD_STATUS_OK;
}
static void my_driver_exit(void *context) {
(void)context;
}
static const rad_module_descriptor_t module = {
.name = "rad_example",
.bus = "platform",
.compatible = "rad,example",
.init = my_driver_init,
.exit = my_driver_exit,
};
rad_status_t rad_module_register(const rad_module_descriptor_t *descriptor)
Public RADPx-OS kernel API entry point.
@ RAD_STATUS_OK
RAD_STATUS_OK.
Definition: radkernel.h:143
struct rad_module_descriptor rad_module_descriptor_t
Public data structure for rad_module_descriptor.
enum rad_status rad_status_t
Public enumeration for rad_status.
Public data structure for rad_module_descriptor.
Definition: radkernel.h:1143
uint32_t size
Public structure field.
Definition: radkernel.h:1144

Register An I2C Controller And Child Driver

static rad_status_t i2c_xfer(void *context,
const rad_i2c_transfer_t *transfer) {
(void)context;
}
static rad_status_t tmp102_probe(void *context, rad_i2c_device_t *device) {
(void)context;
if (rad_i2c_device_get_irq(device, 0, &irq) == RAD_STATUS_OK) {
}
return RAD_STATUS_OK;
}
.transfer = i2c_xfer,
};
.bus_id = 0,
.name = "rad_i2c0",
.tree_path = "/soc/i2c@0",
.clock_hz = 400000,
};
rad_i2c_driver_t driver = {
.size = sizeof(rad_i2c_driver_t),
.name = "rad_i2c_tmp102",
.compatible = "ti,tmp102",
.probe = tmp102_probe,
};
rad_i2c_controller_register(&controller, &ops);
rad_status_t rad_i2c_driver_register(const rad_i2c_driver_t *driver)
Public RADPx-OS kernel API entry point.
rad_status_t rad_i2c_controller_register(const rad_i2c_controller_config_t *config, const rad_i2c_controller_ops_t *ops)
Public RADPx-OS kernel API entry point.
rad_status_t rad_irq_resource_enable(const rad_irq_resource_t *resource)
Public RADPx-OS kernel API entry point.
rad_status_t rad_i2c_bind_tree(void)
Public RADPx-OS kernel API entry point.
struct rad_i2c_driver rad_i2c_driver_t
Public data structure for rad_i2c_driver.
@ RAD_STATUS_INVALID_ARGUMENT
RAD_STATUS_INVALID_ARGUMENT.
Definition: radkernel.h:145
struct rad_i2c_device rad_i2c_device_t
Forward-declared public type rad_i2c_device_t backed by rad_i2c_device.
Definition: radkernel.h:1035
rad_status_t rad_i2c_device_get_irq(const rad_i2c_device_t *device, size_t index, rad_irq_resource_t *resource)
Public RADPx-OS kernel API entry point.
struct rad_i2c_controller_config rad_i2c_controller_config_t
Public data structure for rad_i2c_controller_config.
Public data structure for rad_i2c_controller_config.
Definition: radkernel.h:1044
uint32_t size
Public structure field.
Definition: radkernel.h:1045
Public data structure for rad_i2c_controller_ops.
Definition: radkernel.h:1038
rad_status_t(* transfer)(void *context, const rad_i2c_transfer_t *transfer)
Public callback slot.
Definition: radkernel.h:1040
Public data structure for rad_i2c_driver.
Definition: radkernel.h:1055
uint32_t size
Public structure field.
Definition: radkernel.h:1056
Public data structure for rad_i2c_transfer.
Definition: radkernel.h:1024
Public data structure for rad_irq_resource.
Definition: radkernel.h:1244

Register DMA And Use SPI Auto Mode

.name = "rad_dma0",
.channel_count = 8,
};
.request = my_dma_request,
.release = my_dma_release,
.submit = my_dma_submit,
.wait = my_dma_wait,
.cancel = my_dma_cancel,
};
rad_spi_transfer_t transfer = {
.tx_data = tx,
.rx_data = rx,
.size = count,
.speed_hz = 12000000,
.bits_per_word = 8,
.cs = 0,
.transfer_mode = RAD_SPI_TRANSFER_MODE_AUTO,
};
rad_spi_device_transfer(device, &transfer);
rad_status_t rad_dma_controller_register(const rad_dma_controller_config_t *config, const rad_dma_backend_ops_t *ops)
Public RADPx-OS kernel API entry point.
rad_status_t rad_spi_device_transfer(rad_spi_device_t *device, const rad_spi_transfer_t *transfer)
Public RADPx-OS kernel API entry point.
@ RAD_SPI_TRANSFER_MODE_AUTO
RAD_SPI_TRANSFER_MODE_AUTO.
Definition: radkernel.h:393
struct rad_dma_controller_config rad_dma_controller_config_t
Public data structure for rad_dma_controller_config.
Public data structure for rad_dma_backend_ops.
Definition: radkernel.h:1096
rad_status_t(* request)(void *context, rad_dma_request_id_t request_id, void **backend_channel)
Public callback slot.
Definition: radkernel.h:1098
Public data structure for rad_dma_controller_config.
Definition: radkernel.h:1106
uint32_t size
Public structure field.
Definition: radkernel.h:1107
Public data structure for rad_spi_transfer.
Definition: radkernel.h:1065
const uint8_t * tx_data
Public structure field.
Definition: radkernel.h:1066

Register A Framebuffer

.name = "/dev/fb0",
.output_type = RAD_DISPLAY_OUTPUT_GRUB,
.connector = "virtio-vga",
.primary = 1,
};
fb.info.width = 1024;
fb.info.height = 768;
fb.info.stride_bytes = 4096;
fb.info.pixels = framebuffer_pixels;
struct rad_framebuffer_config rad_framebuffer_config_t
Public data structure for rad_framebuffer_config.
rad_status_t rad_framebuffer_register_ex(const rad_framebuffer_config_t *config, const rad_framebuffer_ops_t *ops)
Public RADPx-OS kernel API entry point.
@ RAD_PIXEL_FORMAT_XRGB8888
RAD_PIXEL_FORMAT_XRGB8888.
Definition: radkernel.h:381
struct rad_framebuffer_info rad_framebuffer_info_t
Public data structure for rad_framebuffer_info.
@ RAD_DISPLAY_OUTPUT_GRUB
RAD_DISPLAY_OUTPUT_GRUB.
Definition: radkernel.h:419
Public data structure for rad_framebuffer_config.
Definition: radkernel.h:964
rad_framebuffer_info_t info
Public structure field.
Definition: radkernel.h:967
uint32_t size
Public structure field.
Definition: radkernel.h:965
uint32_t width
Public structure field.
Definition: radkernel.h:926
uint32_t stride_bytes
Public structure field.
Definition: radkernel.h:928
rad_pixel_format_t pixel_format
Public structure field.
Definition: radkernel.h:929
void * pixels
Public structure field.
Definition: radkernel.h:930
uint32_t height
Public structure field.
Definition: radkernel.h:927
uint32_t size
Public structure field.
Definition: radkernel.h:925

Read Input Events

rad_input_queue_create("kbd0", 64, &queue);
rad_input_device_register_queue("/dev/input/event0", queue);
size_t count = 0;
rad_input_queue_read(queue, events, 8, 16, &count);
rad_status_t rad_input_queue_read(rad_input_queue_t queue, rad_input_event_t *events, size_t capacity, uint32_t timeout_ms, size_t *count)
Public RADPx-OS kernel API entry point.
rad_status_t rad_input_device_register_queue(const char *name, rad_input_queue_t queue)
Public RADPx-OS kernel API entry point.
rad_status_t rad_input_queue_create(const char *name, size_t capacity, rad_input_queue_t *queue)
Public RADPx-OS kernel API entry point.
struct rad_input_queue_handle * rad_input_queue_t
Opaque handle type rad_input_queue_t backed by rad_input_queue_handle.
Definition: radkernel.h:1355
Public data structure for rad_input_event.
Definition: radkernel.h:897

Mount A VFS Provider

.context = fs_context,
.open = fs_open,
.read = fs_read,
.write = fs_write,
.close = fs_close,
.stat = fs_stat,
.list = fs_list,
};
rad_status_t rad_vfs_mount_provider(const char *mount_point, const rad_vfs_backend_ops_t *ops)
Public RADPx-OS kernel API entry point.
void * context
Public structure field.
Definition: radkernel.h:1039
Public data structure for rad_vfs_backend_ops.
Definition: radkernel.h:848

Use File Descriptors Through The Syscall ABI

int32_t fd = rad_fd_open("/etc/init.radsh", RAD_VFS_READ);
char buffer[128];
intptr_t n = rad_fd_read(fd, buffer, sizeof(buffer));
int32_t rad_fd_close(int32_t fd)
Public RADPx-OS kernel API entry point.
intptr_t rad_fd_read(int32_t fd, void *buffer, size_t size)
Public RADPx-OS kernel API entry point.
int32_t rad_fd_open(const char *path, uint32_t flags)
Public RADPx-OS kernel API entry point.
@ RAD_VFS_READ
RAD_VFS_READ.
Definition: radkernel.h:270