From 5f874a06c5f6bf297faee23633a32e9570975950 Mon Sep 17 00:00:00 2001 From: John Hodge Date: Fri, 15 Jan 2010 15:49:58 +0800 Subject: [PATCH] More work on UDI support --- Kernel/Makefile.BuildNum | 2 +- Modules/UDI/Makefile | 2 +- Modules/UDI/buf.c | 47 +++++++++++++++ Modules/UDI/include/udi_buf.h | 105 ++++++++++++++++++++++++++++++++++ Modules/UDI/include/udi_mem.h | 38 ++++++++++++ Modules/UDI/mem.c | 33 +++++++++++ 6 files changed, 225 insertions(+), 2 deletions(-) create mode 100644 Modules/UDI/buf.c create mode 100644 Modules/UDI/include/udi_buf.h create mode 100644 Modules/UDI/include/udi_mem.h create mode 100644 Modules/UDI/mem.c diff --git a/Kernel/Makefile.BuildNum b/Kernel/Makefile.BuildNum index 740bcb0c..e9892dc0 100644 --- a/Kernel/Makefile.BuildNum +++ b/Kernel/Makefile.BuildNum @@ -1 +1 @@ -BUILD_NUM = 1321 +BUILD_NUM = 1324 diff --git a/Modules/UDI/Makefile b/Modules/UDI/Makefile index f553ad96..2658ae77 100644 --- a/Modules/UDI/Makefile +++ b/Modules/UDI/Makefile @@ -2,7 +2,7 @@ # CPPFLAGS = -I./include -OBJ = main.o logging.o strmem.o imc.o +OBJ = main.o logging.o strmem.o imc.o mem.o buf.o OBJ += meta_mgmt.o NAME = UDI diff --git a/Modules/UDI/buf.c b/Modules/UDI/buf.c new file mode 100644 index 00000000..235f3e56 --- /dev/null +++ b/Modules/UDI/buf.c @@ -0,0 +1,47 @@ +/** + * \file buf.c + * \author John Hodge (thePowersGang) + */ +#include +#include +#include + +// === EXPORTS === +EXPORT(udi_buf_copy); +EXPORT(udi_buf_write); +EXPORT(udi_buf_free); + +// === CODE === +void udi_buf_copy( + udi_buf_copy_call_t *callback, + udi_cb_t *gcb, + udi_buf_t *src_buf, + udi_size_t src_off, + udi_size_t src_len, + udi_buf_t *dst_buf, + udi_size_t dst_off, + udi_size_t dst_len, + udi_buf_path_t path_handle + ) +{ + Warning("%s Unimplemented", __func__); +} + +void udi_buf_write( + udi_buf_write_call_t *callback, + udi_cb_t *gcb, + const void *src_mem, + udi_size_t src_len, + udi_buf_t *dst_buf, + udi_size_t dst_off, + udi_size_t dst_len, + udi_buf_path_t path_handle + ) +{ + Warning("%s Unimplemented", __func__); +} + +void udi_buf_free(udi_buf_t *buf) +{ + Warning("%s Unimplemented", __func__); +} diff --git a/Modules/UDI/include/udi_buf.h b/Modules/UDI/include/udi_buf.h new file mode 100644 index 00000000..ebff452f --- /dev/null +++ b/Modules/UDI/include/udi_buf.h @@ -0,0 +1,105 @@ +/** + * \file udi_buf.h + */ +#ifndef _UDI_BUF_H_ +#define _UDI_BUF_H_ + + +typedef struct udi_buf_s udi_buf_t; +typedef struct udi_xfer_constraints_s udi_xfer_constraints_t; +typedef void udi_buf_copy_call_t(udi_cb_t *gcb, udi_buf_t *new_dst_buf); +typedef void udi_buf_write_call_t(udi_cb_t *gcb, udi_buf_t *new_dst_buf); + +/** + * \brief Describes a buffer + * \note Semi-Opaque + */ +struct udi_buf_s +{ + udi_size_t buf_size; + Uint8 Data[]; //!< ENVIRONMENT ONLY +}; + +/** + * \brief + */ +struct udi_xfer_constraints_s +{ + udi_ubit32_t udi_xfer_max; + udi_ubit32_t udi_xfer_typical; + udi_ubit32_t udi_xfer_granularity; + udi_boolean_t udi_xfer_one_piece; + udi_boolean_t udi_xfer_exact_size; + udi_boolean_t udi_xfer_no_reorder; +}; + +// --- MACROS --- +/** + * \brief Allocates a buffer + */ +#define UDI_BUF_ALLOC(callback, gcb, init_data, size, path_handle) \ + udi_buf_write(callback, gcb, init_data, size, NULL, 0, 0, path_handle) + +/** + * \brief Inserts data into a buffer + */ +#define UDI_BUF_INSERT(callback, gcb, new_data, size, dst_buf, dst_off) \ + udi_buf_write(callback, gcb, new_data, size, dst_buf, dst_off, 0, UDI_NULL_BUF_PATH) + +/** + * \brief Removes data from a buffer (data afterwards will be moved forewards) + */ +#define UDI_BUF_DELETE(callback, gcb, size, dst_buf, dst_off) \ + udi_buf_write(callback, gcb, NULL, 0, dst_buf, dst_off, size, UDI_NULL_BUF_PATH) + +/** + * \brief Duplicates \a src_buf + */ +#define UDI_BUF_DUP(callback, gcb, src_buf, path_handle) \ + udi_buf_copy(callback, gcb, src_buf, 0, (src_buf)->buf_size, NULL, 0, 0, path_handle) + + +/** + * \brief Copies data from one buffer to another + */ +extern void udi_buf_copy( + udi_buf_copy_call_t *callback, + udi_cb_t *gcb, + udi_buf_t *src_buf, + udi_size_t src_off, + udi_size_t src_len, + udi_buf_t *dst_buf, + udi_size_t dst_off, + udi_size_t dst_len, + udi_buf_path_t path_handle ); + +/** + * \brief Copies data from driver space to a buffer + */ +extern void udi_buf_write( + udi_buf_write_call_t *callback, + udi_cb_t *gcb, + const void *src_mem, + udi_size_t src_len, + udi_buf_t *dst_buf, + udi_size_t dst_off, + udi_size_t dst_len, + udi_buf_path_t path_handle + ); + +/** + * \brief Reads data from a buffer into driver space + */ +extern void udi_buf_read( + udi_buf_t *src_buf, + udi_size_t src_off, + udi_size_t src_len, + void *dst_mem ); + +/** + * \brief Frees a buffer + */ +extern void udi_buf_free(udi_buf_t *buf); + + +#endif diff --git a/Modules/UDI/include/udi_mem.h b/Modules/UDI/include/udi_mem.h new file mode 100644 index 00000000..d29f25ed --- /dev/null +++ b/Modules/UDI/include/udi_mem.h @@ -0,0 +1,38 @@ +/** + * \file udi_mem.h + */ +#ifndef _UDI_MEM_H_ +#define _UDI_MEM_H_ + +/** + * \brief Callback type for ::udi_mem_alloc + */ +typedef void udi_mem_alloc_call_t(udi_cb_t *gcb, void *new_mem); + +/** + * \brief Allocate memory + */ +extern void udi_mem_alloc( + udi_mem_alloc_call_t *callback, + udi_cb_t *gcb, + udi_size_t size, + udi_ubit8_t flags + ); + +/** + * \brief Values for ::udi_mem_alloc \a flags + * \{ + */ +#define UDI_MEM_NOZERO (1U<<0) //!< No need to zero the memory +#define UDI_MEM_MOVABLE (1U<<1) //!< Globally accessable memory? +/** + * \} + */ + +/** + * \brief Free allocated memory + */ +extern void udi_mem_free(void *target_mem); + + +#endif diff --git a/Modules/UDI/mem.c b/Modules/UDI/mem.c new file mode 100644 index 00000000..06d4893e --- /dev/null +++ b/Modules/UDI/mem.c @@ -0,0 +1,33 @@ +/** + * \file mem.c + * \author John Hodge (thePowersGang) + */ +#include +#include +#include + +// === CODE === +void udi_mem_alloc( + udi_mem_alloc_call_t *callback, + udi_cb_t *gcb, + udi_size_t size, + udi_ubit8_t flags + ) +{ + void *buf = malloc(size); + if(buf) + { + if( !(flags & UDI_MEM_NOZERO) ) + memset(buf, 0, size); + } + callback(gcb, buf); +} + +void udi_mem_free(void *target_mem) +{ + free(target_mem); +} + +// === EXPORTS === +EXPORT(udi_mem_alloc); +EXPORT(udi_mem_free); -- 2.20.1