HelenOS sources
This source file includes following definitions.
- hw_res_get_resource_list
- hw_res_enable_interrupt
- hw_res_disable_interrupt
- hw_res_clear_interrupt
- hw_res_dma_channel_setup
- hw_res_dma_channel_remain
- hw_res_get_flags
#include <device/hw_res.h>
#include <errno.h>
#include <async.h>
#include <stdlib.h>
errno_t hw_res_get_resource_list(async_sess_t *sess,
hw_resource_list_t *hw_resources)
{
sysarg_t count = 0;
async_exch_t *exch = async_exchange_begin(sess);
errno_t rc = async_req_1_1(exch, DEV_IFACE_ID(HW_RES_DEV_IFACE),
HW_RES_GET_RESOURCE_LIST, &count);
if (rc != EOK) {
async_exchange_end(exch);
return rc;
}
size_t size = count * sizeof(hw_resource_t);
hw_resource_t *resources = (hw_resource_t *) malloc(size);
if (resources == NULL) {
async_exchange_end(exch);
return ENOMEM;
}
rc = async_data_read_start(exch, resources, size);
async_exchange_end(exch);
if (rc != EOK) {
free(resources);
return rc;
}
hw_resources->resources = resources;
hw_resources->count = count;
return EOK;
}
errno_t hw_res_enable_interrupt(async_sess_t *sess, int irq)
{
async_exch_t *exch = async_exchange_begin(sess);
errno_t rc = async_req_2_0(exch, DEV_IFACE_ID(HW_RES_DEV_IFACE),
HW_RES_ENABLE_INTERRUPT, irq);
async_exchange_end(exch);
return rc;
}
errno_t hw_res_disable_interrupt(async_sess_t *sess, int irq)
{
async_exch_t *exch = async_exchange_begin(sess);
errno_t rc = async_req_2_0(exch, DEV_IFACE_ID(HW_RES_DEV_IFACE),
HW_RES_DISABLE_INTERRUPT, irq);
async_exchange_end(exch);
return rc;
}
errno_t hw_res_clear_interrupt(async_sess_t *sess, int irq)
{
async_exch_t *exch = async_exchange_begin(sess);
errno_t rc = async_req_2_0(exch, DEV_IFACE_ID(HW_RES_DEV_IFACE),
HW_RES_CLEAR_INTERRUPT, irq);
async_exchange_end(exch);
return rc;
}
errno_t hw_res_dma_channel_setup(async_sess_t *sess,
unsigned channel, uint32_t pa, uint32_t size, uint8_t mode)
{
async_exch_t *exch = async_exchange_begin(sess);
const uint32_t packed = (channel & 0xffff) | (mode << 16);
const errno_t ret = async_req_4_0(exch, DEV_IFACE_ID(HW_RES_DEV_IFACE),
HW_RES_DMA_CHANNEL_SETUP, packed, pa, size);
async_exchange_end(exch);
return ret;
}
errno_t hw_res_dma_channel_remain(async_sess_t *sess, unsigned channel, size_t *rem)
{
async_exch_t *exch = async_exchange_begin(sess);
sysarg_t remain;
const errno_t ret = async_req_2_1(exch, DEV_IFACE_ID(HW_RES_DEV_IFACE),
HW_RES_DMA_CHANNEL_REMAIN, channel, &remain);
async_exchange_end(exch);
if (ret == EOK)
*rem = remain;
return ret;
}
errno_t hw_res_get_flags(async_sess_t *sess, hw_res_flags_t *rflags)
{
async_exch_t *exch = async_exchange_begin(sess);
sysarg_t flags;
const errno_t ret = async_req_1_1(exch, DEV_IFACE_ID(HW_RES_DEV_IFACE),
HW_RES_GET_FLAGS, &flags);
async_exchange_end(exch);
if (ret == EOK)
*rflags = flags;
return ret;
}
HelenOS homepage, sources at GitHub