Drives and serial. #3
@ -4,6 +4,7 @@ extern char lua_boot[];
|
|||||||
extern char lua_component[];
|
extern char lua_component[];
|
||||||
extern char lua_computer[];
|
extern char lua_computer[];
|
||||||
extern char lua_debug[];
|
extern char lua_debug[];
|
||||||
|
extern char lua_drive[];
|
||||||
extern char lua_eeprom[];
|
extern char lua_eeprom[];
|
||||||
extern char lua_fbgpu[];
|
extern char lua_fbgpu[];
|
||||||
extern char lua_filesystem[];
|
extern char lua_filesystem[];
|
||||||
@ -12,9 +13,11 @@ extern char lua_gpudetect[];
|
|||||||
extern char lua_init[];
|
extern char lua_init[];
|
||||||
extern char lua_internet[];
|
extern char lua_internet[];
|
||||||
extern char lua_sandbox[];
|
extern char lua_sandbox[];
|
||||||
|
extern char lua_serial[];
|
||||||
extern char lua_textgpu[];
|
extern char lua_textgpu[];
|
||||||
extern char lua_util_buffer[];
|
extern char lua_util_buffer[];
|
||||||
extern char lua_util_color[];
|
extern char lua_util_color[];
|
||||||
extern char lua_util_random[];
|
extern char lua_util_random[];
|
||||||
|
extern char lua_uuidmgr[];
|
||||||
extern char lua_winapigpu[];
|
extern char lua_winapigpu[];
|
||||||
#endif
|
#endif
|
||||||
|
@ -22,9 +22,13 @@ typedef unsigned short ushort;
|
|||||||
|
|
||||||
lua_State* getL();
|
lua_State* getL();
|
||||||
|
|
||||||
|
char * get_kbid(); // ugly hack
|
||||||
|
|
||||||
void run_init(int argc, char **argv);
|
void run_init(int argc, char **argv);
|
||||||
void lupi_init();
|
void lupi_init();
|
||||||
void luanative_start(lua_State *L);
|
void luanative_start(lua_State *L);
|
||||||
|
void serial_start(lua_State *L);
|
||||||
|
void blk_start(lua_State *L);
|
||||||
void fb_start(lua_State *L);
|
void fb_start(lua_State *L);
|
||||||
void setup_modules(lua_State *L);
|
void setup_modules(lua_State *L);
|
||||||
void termutils_start(lua_State *L);
|
void termutils_start(lua_State *L);
|
||||||
|
155
src/c/blkdev.c
Normal file
155
src/c/blkdev.c
Normal file
@ -0,0 +1,155 @@
|
|||||||
|
#include "lupi.h"
|
||||||
|
#include <lua.h>
|
||||||
|
#include <lualib.h>
|
||||||
|
#include <lauxlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#include <linux/fs.h>
|
||||||
|
#include <linux/hdreg.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
struct blkdev {
|
||||||
|
int fd;
|
||||||
|
int secsize;
|
||||||
|
int platters;
|
||||||
|
size_t size;
|
||||||
|
char * buffer;
|
||||||
|
};
|
||||||
|
|
||||||
|
int blk_open(lua_State * L) {
|
||||||
|
char * path = luaL_checkstring(L, 1);
|
||||||
|
char rpath[255];
|
||||||
|
sprintf(rpath, "/dev/%s", path);
|
||||||
|
int fd = open(rpath, O_RDWR | O_DSYNC);
|
||||||
|
if (fd == -1) {
|
||||||
|
luaL_error(L, "Failed to open %s: %s", rpath, strerror(errno));
|
||||||
|
}
|
||||||
|
struct blkdev * dev = lua_newuserdata(L, sizeof(struct blkdev));
|
||||||
|
dev->fd = fd;
|
||||||
|
struct hd_driveid driveid;
|
||||||
|
if (ioctl(fd, HDIO_GET_IDENTITY, &driveid) < 0) {
|
||||||
|
//luaL_error("Failed to get identity for %s", rpath);
|
||||||
|
dev->platters = 3;
|
||||||
|
// Use another ioctl call to get sector size.
|
||||||
|
if (!ioctl(fd, BLKSSZGET, &dev->secsize)) {
|
||||||
|
// Fuck it, i guess it's 512 bytes.
|
||||||
|
dev->secsize = 512;
|
||||||
|
// Maybe a warning here?
|
||||||
|
}
|
||||||
|
dev->size = lseek(fd, 0, SEEK_END);
|
||||||
|
lseek(fd, 0, SEEK_SET);
|
||||||
|
} else {
|
||||||
|
dev->size = driveid.lba_capacity_2*driveid.sector_bytes;
|
||||||
|
dev->platters = driveid.cur_heads/2;
|
||||||
|
dev->secsize = driveid.sector_bytes;
|
||||||
|
if (dev->size == 0) {
|
||||||
|
dev->size = lseek(fd, 0, SEEK_END);
|
||||||
|
lseek(fd, 0, SEEK_SET);
|
||||||
|
}
|
||||||
|
if (dev->platters == 0) {
|
||||||
|
dev->platters = 3;
|
||||||
|
}
|
||||||
|
if (dev->secsize == 0) {
|
||||||
|
if (!ioctl(fd, BLKSSZGET, &dev->secsize)) {
|
||||||
|
// Fuck it, i guess it's 512 bytes.
|
||||||
|
dev->secsize = 512;
|
||||||
|
// Maybe a warning here too?
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dev->buffer = malloc(dev->secsize);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int blk_readbyte(lua_State * L) {
|
||||||
|
struct blkdev * dev = lua_touserdata(L, 1);
|
||||||
|
off_t offset = luaL_checkinteger(L, 2);
|
||||||
|
lseek(dev->fd, offset-1, SEEK_SET);
|
||||||
|
uint8_t c = 0;
|
||||||
|
size_t ioc = 0;
|
||||||
|
if ((ioc = read(dev->fd, &c, 1)) != 1) {
|
||||||
|
luaL_error(L, "io error! %llu != %llu", ioc, 1);
|
||||||
|
}
|
||||||
|
lua_pushinteger(L, c);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int blk_writebyte(lua_State * L) {
|
||||||
|
struct blkdev * dev = lua_touserdata(L, 1);
|
||||||
|
off_t offset = luaL_checkinteger(L, 2);
|
||||||
|
long byte = luaL_checkinteger(L, 3);
|
||||||
|
if (byte > 255 || byte < 0)
|
||||||
|
luaL_error(L, "%lld is out of range (should be between 0 and 255)", byte);
|
||||||
|
uint8_t i = byte & 0xFF;
|
||||||
|
lseek(dev->fd, offset-1, SEEK_SET);
|
||||||
|
size_t ioc = 0;
|
||||||
|
if ((ioc = write(dev->fd, &i, 1)) != 1) {
|
||||||
|
luaL_error(L, "io error! %llu != %llu", ioc, 1);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int blk_readsector(lua_State * L) {
|
||||||
|
struct blkdev * dev = lua_touserdata(L, 1);
|
||||||
|
off_t offset = luaL_checkinteger(L, 2);
|
||||||
|
lseek(dev->fd, (offset-1)*dev->secsize, SEEK_SET);
|
||||||
|
size_t ioc = 0;
|
||||||
|
if ((ioc = read(dev->fd, dev->buffer, dev->secsize)) != dev->secsize) {
|
||||||
|
luaL_error(L, "io error! %llu != %llu", ioc, dev->secsize);
|
||||||
|
}
|
||||||
|
lua_pushlstring(L, dev->buffer, dev->secsize);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int blk_writesector(lua_State * L) {
|
||||||
|
struct blkdev * dev = lua_touserdata(L, 1);
|
||||||
|
off_t offset = luaL_checkinteger(L, 2);
|
||||||
|
size_t len = 0;
|
||||||
|
char * sec = luaL_checklstring(L, 3, &len);
|
||||||
|
lseek(dev->fd, (offset-1)*dev->secsize, SEEK_SET);
|
||||||
|
if (len > dev->secsize) {
|
||||||
|
len = dev->secsize;
|
||||||
|
}
|
||||||
|
size_t ioc = 0;
|
||||||
|
if ((ioc = write(dev->fd, sec, len)) != len) {
|
||||||
|
luaL_error(L, "io error! %llu != %llu", ioc, dev->secsize);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int blk_getsecsize(lua_State * L) {
|
||||||
|
struct blkdev * dev = lua_touserdata(L, 1);
|
||||||
|
lua_pushinteger(L, dev->secsize);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int blk_getsize(lua_State * L) {
|
||||||
|
struct blkdev * dev = lua_touserdata(L, 1);
|
||||||
|
lua_pushinteger(L, dev->size);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int blk_getplatcount(lua_State * L) {
|
||||||
|
struct blkdev * dev = lua_touserdata(L, 1);
|
||||||
|
lua_pushinteger(L, dev->platters);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void blk_start(lua_State * L) {
|
||||||
|
struct luaL_Reg blklib[] = {
|
||||||
|
{"open", blk_open},
|
||||||
|
{"readbyte", blk_readbyte},
|
||||||
|
{"writebyte", blk_writebyte},
|
||||||
|
{"readsector", blk_readsector},
|
||||||
|
{"writesector", blk_writesector},
|
||||||
|
{"secsize", blk_getsecsize},
|
||||||
|
{"size", blk_getsize},
|
||||||
|
{"platcount", blk_getplatcount},
|
||||||
|
{NULL, NULL}
|
||||||
|
};
|
||||||
|
luaL_openlib(L, "blk", blklib, 0);
|
||||||
|
}
|
@ -35,7 +35,7 @@ static void handleStdin(evutil_socket_t fd, short what, void *eventc) {
|
|||||||
|
|
||||||
lua_getglobal(L, "pushEvent");
|
lua_getglobal(L, "pushEvent");
|
||||||
lua_pushstring(L, "key_down");
|
lua_pushstring(L, "key_down");
|
||||||
lua_pushstring(L, "TODO:SetThisUuid");/* Also in textgpu.lua */
|
lua_pushstring(L, get_kbid());/* Also in textgpu.lua */
|
||||||
lua_pushnumber(L, buf);
|
lua_pushnumber(L, buf);
|
||||||
lua_pushnumber(L, -1);
|
lua_pushnumber(L, -1);
|
||||||
lua_pushstring(L, "root");
|
lua_pushstring(L, "root");
|
||||||
@ -43,7 +43,7 @@ static void handleStdin(evutil_socket_t fd, short what, void *eventc) {
|
|||||||
|
|
||||||
lua_getglobal(L, "pushEvent");
|
lua_getglobal(L, "pushEvent");
|
||||||
lua_pushstring(L, "key_up");
|
lua_pushstring(L, "key_up");
|
||||||
lua_pushstring(L, "TODO:SetThisUuid");
|
lua_pushstring(L, get_kbid());
|
||||||
lua_pushnumber(L, buf);
|
lua_pushnumber(L, buf);
|
||||||
lua_pushnumber(L, -1);
|
lua_pushnumber(L, -1);
|
||||||
lua_pushstring(L, "root");
|
lua_pushstring(L, "root");
|
||||||
|
@ -12,6 +12,7 @@ void lupi_init() {
|
|||||||
mount(NULL, "/sys", "sysfs", 0, NULL);
|
mount(NULL, "/sys", "sysfs", 0, NULL);
|
||||||
mount(NULL, "/proc", "procfs", 0, NULL);
|
mount(NULL, "/proc", "procfs", 0, NULL);
|
||||||
mount(NULL, "/tmp", "tmpfs", 0, NULL);
|
mount(NULL, "/tmp", "tmpfs", 0, NULL);
|
||||||
|
mount(NULL, "/dev", "devtmpfs", 0, NULL);
|
||||||
}
|
}
|
||||||
struct statvfs fsstat;
|
struct statvfs fsstat;
|
||||||
|
|
||||||
|
@ -476,6 +476,20 @@ static int l_debug (lua_State *L) {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
char * kbid = "TODO:SetThisUuid";
|
||||||
|
|
||||||
|
static int l_setkbid(lua_State *L) {
|
||||||
|
size_t len = 0;
|
||||||
|
char * id = luaL_checklstring(L, 1, &len);
|
||||||
|
kbid = malloc(len+1);
|
||||||
|
memcpy(kbid, id, len);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
char * get_kbid() {
|
||||||
|
return kbid;
|
||||||
|
}
|
||||||
|
|
||||||
void luanative_start(lua_State *L) {
|
void luanative_start(lua_State *L) {
|
||||||
|
|
||||||
struct timeval tp;
|
struct timeval tp;
|
||||||
@ -511,6 +525,7 @@ void luanative_start(lua_State *L) {
|
|||||||
{"pull", l_pull},
|
{"pull", l_pull},
|
||||||
{"platform", l_platform},
|
{"platform", l_platform},
|
||||||
{"isinit", l_isinit},
|
{"isinit", l_isinit},
|
||||||
|
{"setkbid", l_setkbid},
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
{"debug", l_debug},
|
{"debug", l_debug},
|
||||||
#endif
|
#endif
|
||||||
|
@ -14,17 +14,20 @@ void setup_modules(lua_State *L) {
|
|||||||
pushstuple(L, "component", lua_component);
|
pushstuple(L, "component", lua_component);
|
||||||
pushstuple(L, "computer", lua_computer);
|
pushstuple(L, "computer", lua_computer);
|
||||||
pushstuple(L, "debug", lua_debug);
|
pushstuple(L, "debug", lua_debug);
|
||||||
|
pushstuple(L, "drive", lua_drive);
|
||||||
pushstuple(L, "eeprom", lua_eeprom);
|
pushstuple(L, "eeprom", lua_eeprom);
|
||||||
pushstuple(L, "filesystem", lua_filesystem);
|
pushstuple(L, "filesystem", lua_filesystem);
|
||||||
pushstuple(L, "gpio", lua_gpio);
|
pushstuple(L, "gpio", lua_gpio);
|
||||||
pushstuple(L, "gpudetect", lua_gpudetect);
|
pushstuple(L, "gpudetect", lua_gpudetect);
|
||||||
pushstuple(L, "internet", lua_internet);
|
pushstuple(L, "internet", lua_internet);
|
||||||
pushstuple(L, "sandbox", lua_sandbox);
|
pushstuple(L, "sandbox", lua_sandbox);
|
||||||
|
pushstuple(L, "serial", lua_serial);
|
||||||
pushstuple(L, "textgpu", lua_textgpu);
|
pushstuple(L, "textgpu", lua_textgpu);
|
||||||
pushstuple(L, "fbgpu", lua_fbgpu);
|
pushstuple(L, "fbgpu", lua_fbgpu);
|
||||||
pushstuple(L, "winapigpu", lua_winapigpu);
|
pushstuple(L, "winapigpu", lua_winapigpu);
|
||||||
pushstuple(L, "color", lua_util_color);
|
pushstuple(L, "color", lua_util_color);
|
||||||
pushstuple(L, "random", lua_util_random);
|
pushstuple(L, "random", lua_util_random);
|
||||||
|
pushstuple(L, "uuidmgr", lua_uuidmgr);
|
||||||
pushstuple(L, "buffer", lua_util_buffer);
|
pushstuple(L, "buffer", lua_util_buffer);
|
||||||
|
|
||||||
pushstuple(L, "eepromDefault", res_eepromDefault);
|
pushstuple(L, "eepromDefault", res_eepromDefault);
|
||||||
|
@ -31,6 +31,8 @@ void run_init(int argc, char **argv) {
|
|||||||
#endif
|
#endif
|
||||||
fb_start (L);
|
fb_start (L);
|
||||||
termutils_start (L);
|
termutils_start (L);
|
||||||
|
serial_start (L);
|
||||||
|
blk_start (L);
|
||||||
event_prepare();
|
event_prepare();
|
||||||
|
|
||||||
int status = luaL_loadbuffer(L, lua_init, strlen(lua_init), "=INIT");
|
int status = luaL_loadbuffer(L, lua_init, strlen(lua_init), "=INIT");
|
||||||
|
159
src/c/serial.c
Normal file
159
src/c/serial.c
Normal file
@ -0,0 +1,159 @@
|
|||||||
|
#include "lupi.h"
|
||||||
|
#include <lua.h>
|
||||||
|
#include <lualib.h>
|
||||||
|
#include <lauxlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <dirent.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <termios.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
|
int s_listports(lua_State * L) {
|
||||||
|
DIR * d = opendir("/sys/class/tty");
|
||||||
|
struct dirent * ent = NULL;
|
||||||
|
struct stat statbuf;
|
||||||
|
char path[255];
|
||||||
|
char linkpath[255];
|
||||||
|
lua_newtable(L);
|
||||||
|
size_t index = 1;
|
||||||
|
while ((ent = readdir(d)) != NULL) {
|
||||||
|
sprintf(path, "/sys/class/tty/%s/device", ent->d_name);
|
||||||
|
if (stat(path, &statbuf) == 0) {
|
||||||
|
readlink(path, linkpath, 255);
|
||||||
|
if (strstr(linkpath, "serial8250") == NULL) {
|
||||||
|
// We have a serial port
|
||||||
|
lua_pushinteger(L, index);
|
||||||
|
lua_pushstring(L, ent->d_name);
|
||||||
|
lua_settable(L, -3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct baudrate {
|
||||||
|
uint32_t baud;
|
||||||
|
tcflag_t flags;
|
||||||
|
};
|
||||||
|
|
||||||
|
// taken from here: https://man7.org/linux/man-pages/man3/termios.3.html
|
||||||
|
struct baudrate baudrates[] = {
|
||||||
|
{0, B0},
|
||||||
|
{50, B50},
|
||||||
|
{75, B75},
|
||||||
|
{110, B110},
|
||||||
|
{134, B134},
|
||||||
|
{150, B150},
|
||||||
|
{200, B200},
|
||||||
|
{300, B300},
|
||||||
|
{600, B600},
|
||||||
|
{1200, B1200},
|
||||||
|
{1800, B1800},
|
||||||
|
{2400, B2400},
|
||||||
|
{4800, B4800},
|
||||||
|
{9600, B9600},
|
||||||
|
{19200, B19200},
|
||||||
|
{38400, B38400},
|
||||||
|
{57600, B57600},
|
||||||
|
{115200, B115200},
|
||||||
|
{230400, B230400}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct baudrate * getbaud(uint32_t baud) {
|
||||||
|
for (size_t i=0; i<sizeof(baudrates)/sizeof(struct baudrate); ++i) {
|
||||||
|
if (baudrates[i].baud == baud) {
|
||||||
|
return &baudrates[i];
|
||||||
|
} else if (baudrates[i].baud > baud) {
|
||||||
|
return &baudrates[i-1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return getbaud(230400);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct sport {
|
||||||
|
uint32_t baudrate;
|
||||||
|
int fd;
|
||||||
|
struct termios options;
|
||||||
|
};
|
||||||
|
|
||||||
|
int s_openport(lua_State * L) {
|
||||||
|
char * path = luaL_checkstring(L, 1);
|
||||||
|
struct sport * port = lua_newuserdata(L, sizeof(struct sport));
|
||||||
|
port->baudrate = 9600;
|
||||||
|
char rpath[255];
|
||||||
|
sprintf(rpath, "/dev/%s", path);
|
||||||
|
port->fd = open(rpath, O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK);
|
||||||
|
if (port->fd == -1)
|
||||||
|
luaL_error(L, "unable to open port %s: ", path, strerror(errno));
|
||||||
|
tcgetattr(port->fd, &port->options);
|
||||||
|
cfsetispeed(&port->options, B9600);
|
||||||
|
cfsetospeed(&port->options, B9600);
|
||||||
|
tcsetattr(port->fd, TCSANOW, &port->options);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int s_setbaudrate(lua_State * L) {
|
||||||
|
struct sport * port = lua_touserdata(L, 1);
|
||||||
|
long raw_br = luaL_checkinteger(L, 2);
|
||||||
|
struct baudrate * br = getbaud(raw_br & 0xFFFFFFFF);
|
||||||
|
//port->options.c_cflag &= ~(CBAUD);
|
||||||
|
//port->options.c_cflag |= br->flags;
|
||||||
|
cfsetispeed(&port->options, br->flags);
|
||||||
|
cfsetospeed(&port->options, br->flags);
|
||||||
|
port->baudrate = br->baud;
|
||||||
|
lua_pushinteger(L, br->baud);
|
||||||
|
port->options.c_cflag &= ~PARENB;
|
||||||
|
port->options.c_cflag &= ~CSTOPB;
|
||||||
|
port->options.c_cflag &= ~CSIZE;
|
||||||
|
port->options.c_cflag |= CS8;
|
||||||
|
tcsetattr(port->fd, TCSANOW, &port->options);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int s_getbaudrate(lua_State * L) {
|
||||||
|
struct sport * port = lua_touserdata(L, 1);
|
||||||
|
lua_pushinteger(L, port->baudrate);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int s_write(lua_State * L) {
|
||||||
|
struct sport * port = lua_touserdata(L, 1);
|
||||||
|
size_t len = 0;
|
||||||
|
char * data = luaL_checklstring(L, 2, &len);
|
||||||
|
size_t ioc = 0;
|
||||||
|
if ((ioc = write(port->fd, data, len)) != len) {
|
||||||
|
luaL_error(L, "io error! %llu != %llu", ioc, len);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int s_read(lua_State * L) {
|
||||||
|
struct sport * port = lua_touserdata(L, 1);
|
||||||
|
char buffer[2048]; // Max packet size
|
||||||
|
long size = luaL_checkinteger(L, 2);
|
||||||
|
size_t ioc = read(port->fd, buffer, size);
|
||||||
|
if (ioc != size && ioc != 0) {
|
||||||
|
luaL_error(L, "io error! %llu != %llu or 0", ioc, size);
|
||||||
|
} else if (ioc != 0) {
|
||||||
|
lua_pushlstring(L, buffer, size);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void serial_start(lua_State * L) {
|
||||||
|
struct luaL_Reg seriallib[] = {
|
||||||
|
{"open", s_openport},
|
||||||
|
{"list", s_listports},
|
||||||
|
{"write", s_write},
|
||||||
|
{"read", s_read},
|
||||||
|
{"setbaud", s_setbaudrate},
|
||||||
|
{"getbaud", s_getbaudrate},
|
||||||
|
{NULL, NULL}
|
||||||
|
};
|
||||||
|
luaL_openlib(L, "serial", seriallib, 0);
|
||||||
|
}
|
@ -109,7 +109,7 @@ function api.invoke(address, method, ...)
|
|||||||
local msg = tostring((native.uptime() - start) / 1000) .. " [+" .. native.uptime() - last .. "] " .. caller.short_src .. ":".. caller.currentline .. " > c.invoke(" .. address .. "): "
|
local msg = tostring((native.uptime() - start) / 1000) .. " [+" .. native.uptime() - last .. "] " .. caller.short_src .. ":".. caller.currentline .. " > c.invoke(" .. address .. "): "
|
||||||
.. components[address].type .. "." .. method
|
.. components[address].type .. "." .. method
|
||||||
.. "(" .. table.concat(t, ", ") .. ")"
|
.. "(" .. table.concat(t, ", ") .. ")"
|
||||||
native.log(msg)
|
--native.log(msg)
|
||||||
end
|
end
|
||||||
return components[address].rawproxy[method](...)
|
return components[address].rawproxy[method](...)
|
||||||
end
|
end
|
||||||
|
74
src/lua/core/drive.lua
Normal file
74
src/lua/core/drive.lua
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
local drive = {}
|
||||||
|
|
||||||
|
function drive.register()
|
||||||
|
local list = native.fs_list("/sys/block")
|
||||||
|
for _, ent in ipairs(list) do
|
||||||
|
-- Match hard drives. floppy drives, an rewindable tape drives
|
||||||
|
if (ent:match("sd%a%d*") or ent:match("hd%a%d*") or ent:match("fd%d+") or ent:match("n?st%d+[lma]?") or ent:match("n?ht%d+[lma]?")) then
|
||||||
|
--if true then
|
||||||
|
lprint("Attempting to open: "..ent)
|
||||||
|
local ok, disk = pcall(blk.open, ent)
|
||||||
|
if ok then
|
||||||
|
local nh = io.open("/sys/block/"..ent.."/device/model", "r")
|
||||||
|
local name = nh:read("*a"):gsub("%s+$", "")
|
||||||
|
nh:close()
|
||||||
|
nh = io.open("/sys/block/"..ent.."/device/vendor", "r")
|
||||||
|
local vendor = nh:read("*a"):gsub("%s+$", "")
|
||||||
|
nh:close()
|
||||||
|
nh = io.open("/sys/block/"..ent.."/device/wwid", "r")
|
||||||
|
local wwid
|
||||||
|
if nh then
|
||||||
|
wwid = nh:read("*a"):gsub("%s+$", "")
|
||||||
|
nh:close()
|
||||||
|
end
|
||||||
|
|
||||||
|
local component = {}
|
||||||
|
|
||||||
|
function component.readByte(offset)
|
||||||
|
return blk.readbyte(disk, offset)
|
||||||
|
end
|
||||||
|
|
||||||
|
function component.writeByte(offset, value)
|
||||||
|
return blk.writebyte(disk, offset, value)
|
||||||
|
end
|
||||||
|
|
||||||
|
function component.getLabel()
|
||||||
|
return name
|
||||||
|
end
|
||||||
|
|
||||||
|
function component.setLabel(str)
|
||||||
|
-- stub
|
||||||
|
return name
|
||||||
|
end
|
||||||
|
|
||||||
|
function component.readSector(sec)
|
||||||
|
return blk.readsector(disk, sec)
|
||||||
|
end
|
||||||
|
|
||||||
|
function component.writeSector(sec, val)
|
||||||
|
return blk.writesector(disk, sec, val)
|
||||||
|
end
|
||||||
|
|
||||||
|
function component.getPlatterCount()
|
||||||
|
return blk.platcount(disk)
|
||||||
|
end
|
||||||
|
|
||||||
|
function component.getSectorSize()
|
||||||
|
return blk.secsize(disk)
|
||||||
|
end
|
||||||
|
|
||||||
|
function component.getCapacity()
|
||||||
|
return blk.size(disk)
|
||||||
|
end
|
||||||
|
|
||||||
|
local gid = wwid or (vendor.." "..name.." "..ent)
|
||||||
|
|
||||||
|
modules.component.api.register(modules.uuidmgr.lookup("drive", gid), "drive", component)
|
||||||
|
else
|
||||||
|
lprint("Can't open blkdev: "..ent..": "..disk)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return drive
|
@ -62,7 +62,7 @@ function eeprom.register()
|
|||||||
function component.makeReadonly()
|
function component.makeReadonly()
|
||||||
return false, "Method stub"
|
return false, "Method stub"
|
||||||
end
|
end
|
||||||
modules.component.api.register(nil, "eeprom", component)
|
modules.component.api.register(modules.uuidmgr.lookup("eeprom", "lmao"), "eeprom", component)
|
||||||
end
|
end
|
||||||
|
|
||||||
return eeprom
|
return eeprom
|
||||||
|
@ -165,9 +165,9 @@ function fbgpu.start()
|
|||||||
termutils.init()
|
termutils.init()
|
||||||
write("\x1b[?25l") --Disable cursor
|
write("\x1b[?25l") --Disable cursor
|
||||||
|
|
||||||
modules.component.api.register(nil, "gpu", gpu)
|
modules.component.api.register(modules.uuidmgr.lookup("gpu", "fbgpu"), "gpu", gpu)
|
||||||
screenAddr = modules.component.api.register(nil, "screen", {getKeyboards = function() return {"TODO:SetThisUuid"} end}) --verry dummy screen, TODO: make it better, kbd uuid also in epoll.c
|
screenAddr = modules.component.api.register(modules.uuidmgr.lookup("screen", "lmao"), "screen", {getKeyboards = function() return {modules.uuidmgr.lookup("keyboard", "lmao")} end}) --verry dummy screen, TODO: make it better, kbd uuid also in epoll.c
|
||||||
modules.component.api.register("TODO:SetThisUuid", "keyboard", {})
|
modules.component.api.register(modules.uuidmgr.lookup("keyboard", "lmao"), "keyboard", {})
|
||||||
|
|
||||||
deadhooks[#deadhooks + 1] = function()
|
deadhooks[#deadhooks + 1] = function()
|
||||||
write("\x1b[?25h") --Enable cursor on quit
|
write("\x1b[?25h") --Enable cursor on quit
|
||||||
|
@ -50,7 +50,7 @@ local function concat(pathA, pathB, ...)
|
|||||||
return canonical(_concat(2, pathA, pathB, ...))
|
return canonical(_concat(2, pathA, pathB, ...))
|
||||||
end
|
end
|
||||||
|
|
||||||
function filesystem.register(basePath, uuid)
|
function filesystem.register(basePath, identifier)
|
||||||
checkArg(1, basePath, "string")
|
checkArg(1, basePath, "string")
|
||||||
|
|
||||||
if not native.fs_exists(basePath) then
|
if not native.fs_exists(basePath) then
|
||||||
@ -156,7 +156,7 @@ function filesystem.register(basePath, uuid)
|
|||||||
checkArg(1, value, "number")
|
checkArg(1, value, "number")
|
||||||
return value --TODO: Implement, use real labels
|
return value --TODO: Implement, use real labels
|
||||||
end
|
end
|
||||||
return modules.component.api.register(uuid, "filesystem", fs)
|
return modules.component.api.register(modules.uuidmgr.lookup("filesystem", identifier or basePath), "filesystem", fs)
|
||||||
end
|
end
|
||||||
|
|
||||||
return filesystem
|
return filesystem
|
||||||
|
@ -68,7 +68,7 @@ gpio.register = function ()
|
|||||||
end
|
end
|
||||||
return _read("/sys/class/gpio/gpio" .. pin .. "/value")
|
return _read("/sys/class/gpio/gpio" .. pin .. "/value")
|
||||||
end
|
end
|
||||||
return modules.component.api.register(uuid, "gpio", component)
|
return modules.component.api.register(modules.uuidmgr.lookup("gpio", "lmao"), "gpio", component)
|
||||||
end
|
end
|
||||||
|
|
||||||
return gpio
|
return gpio
|
||||||
|
@ -44,6 +44,10 @@ lprint = function (...)
|
|||||||
end
|
end
|
||||||
|
|
||||||
lprint("LuPI L1 INIT")
|
lprint("LuPI L1 INIT")
|
||||||
|
local ports = serial.list()
|
||||||
|
for i=1, #ports do
|
||||||
|
lprint(ports[i])
|
||||||
|
end
|
||||||
modules = {}
|
modules = {}
|
||||||
deadhooks = {}
|
deadhooks = {}
|
||||||
|
|
||||||
@ -74,10 +78,14 @@ function main()
|
|||||||
loadModule("debug")
|
loadModule("debug")
|
||||||
end
|
end
|
||||||
loadModule("random")
|
loadModule("random")
|
||||||
|
loadModule("uuidmgr")
|
||||||
loadModule("color")
|
loadModule("color")
|
||||||
loadModule("buffer")
|
loadModule("buffer")
|
||||||
|
|
||||||
modules.address = modules.random.uuid() --TODO: PREALPHA: Make constant
|
--modules.address = modules.random.uuid() --TODO: PREALPHA: Make constant
|
||||||
|
modules.address = modules.uuidmgr.lookup("modules", "lmao") --Made constant
|
||||||
|
native.setkbid(modules.uuidmgr.lookup("keyboard", "lmao"))
|
||||||
|
|
||||||
|
|
||||||
--Core
|
--Core
|
||||||
loadModule("component")
|
loadModule("component")
|
||||||
@ -90,6 +98,8 @@ function main()
|
|||||||
loadModule("gpudetect")
|
loadModule("gpudetect")
|
||||||
loadModule("filesystem")
|
loadModule("filesystem")
|
||||||
loadModule("internet")
|
loadModule("internet")
|
||||||
|
loadModule("serial")
|
||||||
|
loadModule("drive")
|
||||||
|
|
||||||
--Userspace
|
--Userspace
|
||||||
loadModule("sandbox")
|
loadModule("sandbox")
|
||||||
@ -99,19 +109,20 @@ function main()
|
|||||||
modules.component.prepare()
|
modules.component.prepare()
|
||||||
modules.computer.prepare()
|
modules.computer.prepare()
|
||||||
_G.pushEvent = modules.computer.api.pushSignal
|
_G.pushEvent = modules.computer.api.pushSignal
|
||||||
|
modules.serial.register()
|
||||||
|
modules.drive.register()
|
||||||
modules.eeprom.register()
|
modules.eeprom.register()
|
||||||
modules.gpio.register()
|
modules.gpio.register()
|
||||||
modules.internet.start()
|
modules.internet.start()
|
||||||
modules.filesystem.register("root")
|
modules.filesystem.register("root", "root")
|
||||||
if native.debug and native.platform():match("unix") then
|
if native.debug and native.platform():match("unix") then
|
||||||
modules.filesystem.register("/", "11111111-1111-1111-1111-111111111111")
|
modules.filesystem.register("/", "realroot")
|
||||||
end
|
end
|
||||||
if native.platform():match("unix") then
|
if native.platform():match("unix") then
|
||||||
modules.computer.tmp = modules.filesystem.register("/tmp/lupi-" .. modules.random.uuid())
|
modules.computer.tmp = modules.filesystem.register("/tmp/lupi-" .. modules.random.uuid(), "tmpfs")
|
||||||
else
|
else
|
||||||
native.fs_mkdir("tmp")
|
native.fs_mkdir("tmp")
|
||||||
modules.computer.tmp = modules.filesystem.register("tmp/lupi-" .. modules.random.uuid())
|
modules.computer.tmp = modules.filesystem.register("tmp/lupi-" .. modules.random.uuid(), "tmpfs")
|
||||||
--TODO: cleaning hook or something
|
--TODO: cleaning hook or something
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -120,7 +131,7 @@ function main()
|
|||||||
if native.debug then
|
if native.debug then
|
||||||
modules.debug.hook()
|
modules.debug.hook()
|
||||||
end
|
end
|
||||||
|
modules.uuidmgr.store()
|
||||||
modules.boot.boot()
|
modules.boot.boot()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -157,7 +157,7 @@ function internet.start()
|
|||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
modules.component.api.register(nil, "internet", component)
|
modules.component.api.register(modules.uuidmgr.lookup("internet", "lmao"), "internet", component)
|
||||||
end
|
end
|
||||||
|
|
||||||
return internet
|
return internet
|
||||||
|
32
src/lua/core/serial.lua
Normal file
32
src/lua/core/serial.lua
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
local com = {}
|
||||||
|
|
||||||
|
function com.register()
|
||||||
|
local ports = serial.list()
|
||||||
|
for i=1, #ports do
|
||||||
|
lprint("Serial port: "..ports[i])
|
||||||
|
local component = {}
|
||||||
|
local ok, dev = pcall(serial.open, ports[i])
|
||||||
|
if not dev then lprint("Can't open port: "..ports[i]..": "..dev) goto continue end
|
||||||
|
--lprint(dev)
|
||||||
|
function component.setBaudRate(baud)
|
||||||
|
return serial.setbaud(dev, baud)
|
||||||
|
end
|
||||||
|
|
||||||
|
function component.getBaudRate()
|
||||||
|
return serial.getbaud(dev)
|
||||||
|
end
|
||||||
|
|
||||||
|
function component.write(s)
|
||||||
|
return serial.write(dev, s)
|
||||||
|
end
|
||||||
|
|
||||||
|
function component.read(amt)
|
||||||
|
return serial.read(dev, amt)
|
||||||
|
end
|
||||||
|
|
||||||
|
modules.component.api.register(modules.uuidmgr.lookup("serial", ports[i]), "serial", component)
|
||||||
|
::continue::
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return com
|
@ -255,9 +255,9 @@ function textgpu.start()
|
|||||||
gpu.setForeground(0xFFFFFF)
|
gpu.setForeground(0xFFFFFF)
|
||||||
gpu.setBackground(0x000000)
|
gpu.setBackground(0x000000)
|
||||||
|
|
||||||
local gpuaddr = modules.component.api.register(nil, "gpu", gpu)
|
local gpuaddr = modules.component.api.register(modules.uuidmgr.lookup("gpu", "text"), "gpu", gpu)
|
||||||
screenAddr = modules.component.api.register(nil, "screen", {getKeyboards = function() return {"TODO:SetThisUuid"} end}) --verry dummy screen, TODO: make it better, kbd uuid also in epoll.c
|
screenAddr = modules.component.api.register(modules.uuidmgr.lookup("screen", "lmao"), "screen", {getKeyboards = function() return {modules.uuidmgr.lookup("keyboard", "lmao")} end}) --verry dummy screen, TODO: make it better, kbd uuid also in epoll.c
|
||||||
modules.component.api.register("TODO:SetThisUuid", "keyboard", {})
|
modules.component.api.register(modules.uuidmgr.lookup("keyboard", "lmao"), "keyboard", {})
|
||||||
|
|
||||||
deadhooks[#deadhooks + 1] = function()
|
deadhooks[#deadhooks + 1] = function()
|
||||||
write("\x1b[?25h\x1b[" .. ((h-1)|0) .. ";1H") --Enable cursor on quit
|
write("\x1b[?25h\x1b[" .. ((h-1)|0) .. ";1H") --Enable cursor on quit
|
||||||
|
72
src/lua/core/uuidmgr.lua
Normal file
72
src/lua/core/uuidmgr.lua
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
local uuidmgr = {
|
||||||
|
fileversion = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
local uuidstorage = {}
|
||||||
|
|
||||||
|
local storeheader = "c36HH" -- oops
|
||||||
|
|
||||||
|
do
|
||||||
|
local store = io.open("uuidstore.dat", "r")
|
||||||
|
if store then
|
||||||
|
if native.debug then lprint("DEBUG: Loading uuidstore.dat...") end
|
||||||
|
pcall(function()
|
||||||
|
local version, count = string.unpack("IH", store:read(6))
|
||||||
|
if native.debug then lprint(string.format("DEBUG: File version %u, count %u", version, count)) end
|
||||||
|
if version > uuidmgr.fileversion then
|
||||||
|
lprint("ERROR: Invalid version!")
|
||||||
|
error("invalid version")
|
||||||
|
end
|
||||||
|
for i=1, count do
|
||||||
|
local uuid, clen, ilen = storeheader:unpack(store:read(storeheader:packsize()))
|
||||||
|
local cname, id = store:read(clen), store:read(ilen)
|
||||||
|
uuidstorage[cname] = uuidstorage[cname] or {}
|
||||||
|
uuidstorage[cname][id] = uuid
|
||||||
|
if native.debug then lprint(string.format("DEBUG: Found %s:%s's UUID of %s", cname, id, uuid)) end
|
||||||
|
end
|
||||||
|
store:close()
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function uuidmgr.lookup(component, identifier)
|
||||||
|
uuidstorage[component] = uuidstorage[component] or {}
|
||||||
|
local uuid = uuidstorage[component][identifier]
|
||||||
|
if not uuid then
|
||||||
|
uuid = modules.random.uuid()
|
||||||
|
if native.debug then
|
||||||
|
lprint(string.format("DEBUG: Registed component of type %s with identifier %s as uuid %s", component, identifier, uuid))
|
||||||
|
end
|
||||||
|
uuidstorage[component][identifier] = uuid
|
||||||
|
uuidmgr.store()
|
||||||
|
else
|
||||||
|
if native.debug then
|
||||||
|
lprint(string.format("DEBUG: Looked up component of type %s with identifier %s as uuid %s", component, identifier, uuid))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return uuid
|
||||||
|
end
|
||||||
|
|
||||||
|
function uuidmgr.store()
|
||||||
|
local store = io.open("uuidstore.dat", "w")
|
||||||
|
local saved_ids = {}
|
||||||
|
for component, ids in pairs(uuidstorage) do
|
||||||
|
for id, uuid in pairs(ids) do
|
||||||
|
table.insert(saved_ids, {uuid=uuid, component=component, id=id})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if native.debug then
|
||||||
|
lprint(string.format("DEBUG: Saving %d static UUIDs", #saved_ids))
|
||||||
|
end
|
||||||
|
store:write(string.pack("IH", uuidmgr.fileversion, #saved_ids))
|
||||||
|
for i=1, #saved_ids do
|
||||||
|
local uuid, component, id = saved_ids[i].uuid, saved_ids[i].component, saved_ids[i].id
|
||||||
|
store:write(storeheader:pack(uuid, #component, #id),component,id)
|
||||||
|
if native.debug then
|
||||||
|
lprint(string.format("DEBUG: Saving %s:%s as %s", component, id, uuid))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
store:close()
|
||||||
|
end
|
||||||
|
|
||||||
|
return uuidmgr
|
@ -158,9 +158,9 @@ function wingpu.start()
|
|||||||
lprint("Couldn't open window: " .. tostring(reason))
|
lprint("Couldn't open window: " .. tostring(reason))
|
||||||
end
|
end
|
||||||
|
|
||||||
modules.component.api.register(nil, "gpu", gpu)
|
modules.component.api.register(modules.uuidmgr.lookup("gpu", "wingpu"), "gpu", gpu)
|
||||||
screenAddr = modules.component.api.register(nil, "screen", {getKeyboards = function() return {"TODO:SetThisUuid"} end}) --verry dummy screen, TODO: make it better, kbd uuid also in epoll.c
|
screenAddr = modules.component.api.register(modules.uuidmgr.lookup("screen", "lmao"), "screen", {getKeyboards = function() return {modules.uuidmgr.lookup("keyboard", "lmao")} end}) --verry dummy screen, TODO: make it better, kbd uuid also in epoll.c
|
||||||
modules.component.api.register("TODO:SetThisUuid", "keyboard", {})
|
modules.component.api.register(modules.uuidmgr.lookup("keyboard", "lmao"), "keyboard", {})
|
||||||
|
|
||||||
return s
|
return s
|
||||||
end
|
end
|
||||||
|
Loading…
Reference in New Issue
Block a user