git://scm.lunaixsky.com
/
lunaix-os.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
feat: owloysius - dynamic init function invocator
[lunaix-os.git]
/
lunaix-os
/
hal
/
char
/
serial.c
diff --git
a/lunaix-os/hal/char/serial.c
b/lunaix-os/hal/char/serial.c
index 8997c57ed594871ff49f147c47ce1d1dab784400..528f1417d692cb6abecf95c5282eb4d92891673d 100644
(file)
--- a/
lunaix-os/hal/char/serial.c
+++ b/
lunaix-os/hal/char/serial.c
@@
-7,6
+7,15
@@
#include <hal/serial.h>
#include <hal/serial.h>
+#define lock_sdev(sdev) device_lock((sdev)->dev)
+#define unlock_sdev(sdev) device_unlock((sdev)->dev)
+#define unlock_and_wait(sdev, wq) \
+ ({ \
+ unlock_sdev(sdev); \
+ pwait(&(sdev)->wq); \
+ lock_sdev(sdev); \
+ })
+
static DEFINE_LLIST(serial_devs);
static int serial_idx = 0;
static DEFINE_LLIST(serial_devs);
static int serial_idx = 0;
@@
-15,24
+24,28
@@
static int serial_idx = 0;
int
serial_accept_one(struct serial_dev* sdev, u8_t val)
{
int
serial_accept_one(struct serial_dev* sdev, u8_t val)
{
- return !!
fifo_putone
(&sdev->rxbuf, val);
+ return !!
rbuffer_put
(&sdev->rxbuf, val);
}
int
serial_accept_buffer(struct serial_dev* sdev, void* val, size_t len)
{
}
int
serial_accept_buffer(struct serial_dev* sdev, void* val, size_t len)
{
- return !!
fifo_write
(&sdev->rxbuf, val, len);
+ return !!
rbuffer_puts
(&sdev->rxbuf, val, len);
}
void
serial_end_recv(struct serial_dev* sdev)
{
}
void
serial_end_recv(struct serial_dev* sdev)
{
+ mark_device_done_read(sdev->dev);
+
pwake_one(&sdev->wq_rxdone);
}
void
serial_end_xmit(struct serial_dev* sdev, size_t len)
{
pwake_one(&sdev->wq_rxdone);
}
void
serial_end_xmit(struct serial_dev* sdev, size_t len)
{
+ mark_device_done_write(sdev->dev);
+
sdev->wr_len = len;
pwake_one(&sdev->wq_txdone);
}
sdev->wr_len = len;
pwake_one(&sdev->wq_txdone);
}
@@
-40,11
+53,11
@@
serial_end_xmit(struct serial_dev* sdev, size_t len)
int
serial_readone_nowait(struct serial_dev* sdev, u8_t* val)
{
int
serial_readone_nowait(struct serial_dev* sdev, u8_t* val)
{
-
mutex_lock(&sdev->lock
);
+
lock_sdev(sdev
);
- int rd_len =
fifo_readone(&sdev->rxbuf,
val);
+ int rd_len =
rbuffer_get(&sdev->rxbuf, (char*)
val);
-
mutex_unlock(&sdev->lock
);
+
unlock_sdev(sdev
);
return rd_len;
}
return rd_len;
}
@@
-52,26
+65,30
@@
serial_readone_nowait(struct serial_dev* sdev, u8_t* val)
void
serial_readone(struct serial_dev* sdev, u8_t* val)
{
void
serial_readone(struct serial_dev* sdev, u8_t* val)
{
-
mutex_lock(&sdev->lock
);
+
lock_sdev(sdev
);
- while (!fifo_readone(&sdev->rxbuf, val)) {
- pwait(&sdev->wq_rxdone);
+ mark_device_doing_read(sdev->dev);
+
+ while (!rbuffer_get(&sdev->rxbuf, (char*)val)) {
+ unlock_and_wait(sdev, wq_rxdone);
}
}
-
mutex_unlock(&sdev->lock
);
+
unlock_sdev(sdev
);
}
size_t
serial_readbuf(struct serial_dev* sdev, u8_t* buf, size_t len)
{
}
size_t
serial_readbuf(struct serial_dev* sdev, u8_t* buf, size_t len)
{
- mutex_lock(&sdev->lock);
+ lock_sdev(sdev);
+
+ mark_device_doing_read(sdev->dev);
size_t rdlen;
size_t rdlen;
- while (!(rdlen =
fifo_read(&sdev->rxbuf,
buf, len))) {
-
pwait(&sdev->
wq_rxdone);
+ while (!(rdlen =
rbuffer_gets(&sdev->rxbuf, (char*)
buf, len))) {
+
unlock_and_wait(sdev,
wq_rxdone);
}
}
-
mutex_unlock(&sdev->lock
);
+
unlock_sdev(sdev
);
return rdlen;
}
return rdlen;
}
@@
-79,11
+96,13
@@
serial_readbuf(struct serial_dev* sdev, u8_t* buf, size_t len)
int
serial_readbuf_nowait(struct serial_dev* sdev, u8_t* buf, size_t len)
{
int
serial_readbuf_nowait(struct serial_dev* sdev, u8_t* buf, size_t len)
{
- mutex_lock(&sdev->lock);
+ lock_sdev(sdev);
+
+ mark_device_doing_read(sdev->dev);
- int rdlen =
fifo_read(&sdev->rxbuf,
buf, len);
+ int rdlen =
rbuffer_gets(&sdev->rxbuf, (char*)
buf, len);
-
mutex_unlock(&sdev->lock
);
+
unlock_sdev(sdev
);
return rdlen;
}
return rdlen;
}
@@
-91,17
+110,19
@@
serial_readbuf_nowait(struct serial_dev* sdev, u8_t* buf, size_t len)
int
serial_writebuf(struct serial_dev* sdev, u8_t* buf, size_t len)
{
int
serial_writebuf(struct serial_dev* sdev, u8_t* buf, size_t len)
{
- mutex_lock(&sdev->lock);
+ lock_sdev(sdev);
+
+ mark_device_doing_write(sdev->dev);
if (sdev->write(sdev, buf, len) == RXTX_DONE) {
goto done;
}
if (sdev->write(sdev, buf, len) == RXTX_DONE) {
goto done;
}
-
pwait(&sdev->
wq_txdone);
+
unlock_and_wait(sdev,
wq_txdone);
done:
int rdlen = sdev->wr_len;
done:
int rdlen = sdev->wr_len;
-
mutex_unlock(&sdev->lock
);
+
unlock_sdev(sdev
);
return rdlen;
}
return rdlen;
}
@@
-109,12
+130,14
@@
done:
int
serial_writebuf_nowait(struct serial_dev* sdev, u8_t* buf, size_t len)
{
int
serial_writebuf_nowait(struct serial_dev* sdev, u8_t* buf, size_t len)
{
- mutex_lock(&sdev->lock);
+ lock_sdev(sdev);
+
+ mark_device_doing_write(sdev->dev);
sdev->write(sdev, buf, len);
int rdlen = sdev->wr_len;
sdev->write(sdev, buf, len);
int rdlen = sdev->wr_len;
-
mutex_unlock(&sdev->lock
);
+
unlock_sdev(sdev
);
return rdlen;
}
return rdlen;
}
@@
-125,6
+148,13
@@
__serial_read(struct device* dev, void* buf, size_t offset, size_t len)
return serial_readbuf(serial_device(dev), &((u8_t*)buf)[offset], len);
}
return serial_readbuf(serial_device(dev), &((u8_t*)buf)[offset], len);
}
+static int
+__serial_read_async(struct device* dev, void* buf, size_t offset, size_t len)
+{
+ return serial_readbuf_nowait(
+ serial_device(dev), &((u8_t*)buf)[offset], len);
+}
+
static int
__serial_read_page(struct device* dev, void* buf, size_t offset)
{
static int
__serial_read_page(struct device* dev, void* buf, size_t offset)
{
@@
-137,6
+167,13
@@
__serial_write(struct device* dev, void* buf, size_t offset, size_t len)
return serial_writebuf(serial_device(dev), &((u8_t*)buf)[offset], len);
}
return serial_writebuf(serial_device(dev), &((u8_t*)buf)[offset], len);
}
+static int
+__serial_write_async(struct device* dev, void* buf, size_t offset, size_t len)
+{
+ return serial_writebuf_nowait(
+ serial_device(dev), &((u8_t*)buf)[offset], len);
+}
+
static int
__serial_write_page(struct device* dev, void* buf, size_t offset)
{
static int
__serial_write_page(struct device* dev, void* buf, size_t offset)
{
@@
-155,28
+192,43
@@
__serial_exec_command(struct device* dev, u32_t req, va_list args)
return sdev->exec_cmd(sdev, req, args);
}
return sdev->exec_cmd(sdev, req, args);
}
+static int
+__serial_poll_event(struct device* dev)
+{
+ struct serial_dev* sdev = serial_device(dev);
+
+ return sdev->dev->poll_evflags;
+}
+
#define RXBUF_SIZE 512
struct serial_dev*
#define RXBUF_SIZE 512
struct serial_dev*
-serial_create()
+serial_create(
struct devclass* class, char* if_ident
)
{
struct serial_dev* sdev = valloc(sizeof(struct serial_dev));
{
struct serial_dev* sdev = valloc(sizeof(struct serial_dev));
- struct device* dev = device_a
ddseq(NULL, sdev, "ttyS%d", serial_idx++
);
+ struct device* dev = device_a
llocseq(NULL, sdev
);
dev->ops.read = __serial_read;
dev->ops.read_page = __serial_read_page;
dev->ops.read = __serial_read;
dev->ops.read_page = __serial_read_page;
+ dev->ops.read_async = __serial_read_async;
+ dev->ops.write_async = __serial_write_async;
dev->ops.write = __serial_write;
dev->ops.write_page = __serial_write_page;
dev->ops.exec_cmd = __serial_exec_command;
dev->ops.write = __serial_write;
dev->ops.write_page = __serial_write_page;
dev->ops.exec_cmd = __serial_exec_command;
+ dev->ops.poll = __serial_poll_event;
sdev->dev = dev;
dev->underlay = sdev;
waitq_init(&sdev->wq_rxdone);
waitq_init(&sdev->wq_txdone);
sdev->dev = dev;
dev->underlay = sdev;
waitq_init(&sdev->wq_rxdone);
waitq_init(&sdev->wq_txdone);
-
fifo_init(&sdev->rxbuf, valloc(RXBUF_SIZE), RXBUF_SIZE, 0
);
+
rbuffer_init(&sdev->rxbuf, valloc(RXBUF_SIZE), RXBUF_SIZE
);
llist_append(&serial_devs, &sdev->sdev_list);
llist_append(&serial_devs, &sdev->sdev_list);
- // llist_init_head(&sdev->cmds);
+ register_device(dev, class, "port%s%d", if_ident, class->variant);
+
+ sdev->at_term = term_create(dev, if_ident);
+
+ class->variant++;
return sdev;
}
return sdev;
}
@@
-186,7
+238,7
@@
serial_get_avilable()
struct serial_dev *pos, *n;
llist_for_each(pos, n, &serial_devs, sdev_list)
{
struct serial_dev *pos, *n;
llist_for_each(pos, n, &serial_devs, sdev_list)
{
- if (!
mutex_on_hold(&pos->lock
)) {
+ if (!
device_locked(pos->dev
)) {
return pos;
}
}
return pos;
}
}