int
serial_readone_nowait(struct serial_dev* sdev, u8_t* val)
{
- mutex_lock(&sdev->lock);
+ device_lock(sdev->dev);
int rd_len = fifo_readone(&sdev->rxbuf, val);
- mutex_unlock(&sdev->lock);
+ device_unlock(sdev->dev);
return rd_len;
}
void
serial_readone(struct serial_dev* sdev, u8_t* val)
{
- mutex_lock(&sdev->lock);
+ device_lock(sdev->dev);
while (!fifo_readone(&sdev->rxbuf, val)) {
pwait(&sdev->wq_rxdone);
}
- mutex_unlock(&sdev->lock);
+ device_unlock(sdev->dev);
}
size_t
serial_readbuf(struct serial_dev* sdev, u8_t* buf, size_t len)
{
- mutex_lock(&sdev->lock);
+ device_lock(sdev->dev);
size_t rdlen;
while (!(rdlen = fifo_read(&sdev->rxbuf, buf, len))) {
pwait(&sdev->wq_rxdone);
}
- mutex_unlock(&sdev->lock);
+ device_unlock(sdev->dev);
return rdlen;
}
int
serial_readbuf_nowait(struct serial_dev* sdev, u8_t* buf, size_t len)
{
- mutex_lock(&sdev->lock);
+ device_lock(sdev->dev);
int rdlen = fifo_read(&sdev->rxbuf, buf, len);
- mutex_unlock(&sdev->lock);
+ device_unlock(sdev->dev);
return rdlen;
}
int
serial_writebuf(struct serial_dev* sdev, u8_t* buf, size_t len)
{
- mutex_lock(&sdev->lock);
+ device_lock(sdev->dev);
if (sdev->write(sdev, buf, len) == RXTX_DONE) {
goto done;
done:
int rdlen = sdev->wr_len;
- mutex_unlock(&sdev->lock);
+ device_unlock(sdev->dev);
return rdlen;
}
int
serial_writebuf_nowait(struct serial_dev* sdev, u8_t* buf, size_t len)
{
- mutex_lock(&sdev->lock);
+ device_lock(sdev->dev);
sdev->write(sdev, buf, len);
int rdlen = sdev->wr_len;
- mutex_unlock(&sdev->lock);
+ device_unlock(sdev->dev);
return rdlen;
}
#define RXBUF_SIZE 512
struct serial_dev*
-serial_create()
+serial_create(struct devclass* class)
{
struct serial_dev* sdev = valloc(sizeof(struct serial_dev));
- struct device* dev = device_addseq(NULL, sdev, "ttyS%d", serial_idx++);
+ struct device* dev = device_allocseq(NULL, sdev);
dev->ops.read = __serial_read;
dev->ops.read_page = __serial_read_page;
dev->ops.write = __serial_write;
llist_append(&serial_devs, &sdev->sdev_list);
// llist_init_head(&sdev->cmds);
+ class->variant++;
+ device_register(dev, class, "ttyS%d", class->variant);
+
return sdev;
}
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;
}
}