#
CPPFLAGS = -I./include
-OBJ = main.o logging.o strmem.o imc.o mem.o buf.o cb.o
-OBJ += meta_mgmt.o meta_gio.o
-OBJ += physio.o physio/meta_bus.o physio/meta_intr.o
+
+# - UDI Library Files
+LIB_OBJS := logging.o strmem.o imc.o mem.o buf.o cb.o
+LIB_OBJS += queues.o time.o
+LIB_OBJS += meta_mgmt.o meta_gio.o
+LIB_OBJS += physio.o physio/meta_bus.o physio/meta_intr.o physio/pio.o physio/dma.o
+LIB_OBJS += scsi.o
+# - UDI->Acess Translation Layer
+TRANS_OBJS :=
+
+OBJ = main.o channels.o
+OBJ += $(LIB_OBJS:%=udi_lib/%) $(TRANS_OBJS:%=trans/%)
NAME = UDI
-include ../Makefile.tpl
+++ /dev/null
-/**
- * \file buf.c
- * \author John Hodge (thePowersGang)
- *
- * Buffer Manipulation
- */
-#include <acess.h>
-#include <udi.h>
-
-// === EXPORTS ===
-EXPORT(udi_buf_copy);
-EXPORT(udi_buf_write);
-EXPORT(udi_buf_read);
-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
- )
-{
- UNIMPLEMENTED();
-}
-
-/**
- * \brief Write to a buffer
- * \param callback Function to call once the write has completed
- * \param gcb Control Block
- * \param src_mem Source Data
- * \param src_len Length of source data
- * \param dst_buf Destination buffer
- * \param dst_off Destination offset in the buffer
- * \param dst_len Length of destination area (What the?, Redundant
- * Department of redundacny department)
- * \param path_handle ???
- */
-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
- )
-{
- UNIMPLEMENTED();
-}
-
-void udi_buf_read(
- udi_buf_t *src_buf,
- udi_size_t src_off,
- udi_size_t src_len,
- void *dst_mem )
-{
- UNIMPLEMENTED();
-}
-
-void udi_buf_free(udi_buf_t *buf)
-{
- UNIMPLEMENTED();
-}
+++ /dev/null
-/**
- * \file cb.c
- * \author John Hodge (thePowersGang)
- * \brief Control block code
- */
-#include <acess.h>
-#include <udi.h>
-
-// === CODE ===
-void udi_cb_alloc (
- udi_cb_alloc_call_t *callback, //!< Function to be called when the CB is allocated
- udi_cb_t *gcb, //!< Parent Control Block
- udi_index_t cb_idx,
- udi_channel_t default_channel
- )
-{
- UNIMPLEMENTED();
-}
-
-void udi_cb_alloc_dynamic(
- udi_cb_alloc_call_t *callback,
- udi_cb_t *gcb,
- udi_index_t cb_idx,
- udi_channel_t default_channel,
- udi_size_t inline_size,
- udi_layout_t *inline_layout
- )
-{
- UNIMPLEMENTED();
-}
-
-void udi_cb_alloc_batch(
- udi_cb_alloc_batch_call_t *callback, //!<
- udi_cb_t *gcb, //!<
- udi_index_t cb_idx,
- udi_index_t count,
- udi_boolean_t with_buf,
- udi_size_t buf_size,
- udi_buf_path_t path_handle
- )
-{
- UNIMPLEMENTED();
-}
-
-void udi_cb_free(udi_cb_t *cb)
-{
- UNIMPLEMENTED();
-}
-
-void udi_cancel(udi_cancel_call_t *callback, udi_cb_t *gcb)
-{
- UNIMPLEMENTED();
-}
-
-// === EXPORTS ===
-EXPORT(udi_cb_alloc);
-EXPORT(udi_cb_alloc_dynamic);
-EXPORT(udi_cb_alloc_batch);
-EXPORT(udi_cb_free);
-EXPORT(udi_cancel);
--- /dev/null
+/*
+ * Acess2 UDI Layer
+ * - By John Hodge (thePowersGang)
+ */
+#define DEBUG 0
+#include <acess.h>
+#include <udi.h>
+#include "udi_internal.h"
+
+struct sUDI_ChannelSide {
+ struct sUDI_Channel *BackPtr;
+ const void *Ops;
+ void *Context;
+};
+
+typedef struct sUDI_Channel
+{
+ enum eUDI_MetaLang MetaLang;
+ struct sUDI_ChannelSide Side[2];
+} tUDI_Channel;
+
+// === CODE ===
+udi_channel_t UDI_CreateChannel(enum eUDI_MetaLang metalang, udi_index_t meta_ops_num,
+ tUDI_DriverInstance *ThisEnd, udi_index_t ThisOpsIndex,
+ tUDI_DriverInstance *OtherEnd, udi_index_t OtherOpsIndex)
+{
+ tUDI_Channel *ret = NEW(tUDI_Channel,);
+ ret->MetaLang = metalang;
+ ret->Side[0].BackPtr = ret;
+// ret->Side[0].Ops = ThisEnd->Module->InitInfo->Op;
+ ret->Side[1].BackPtr = ret;
+ return (udi_channel_t)&ret->Side[0].BackPtr;
+}
+
+const void *UDI_int_ChannelPrepForCall(udi_cb_t *gcb, enum eUDI_MetaLang metalang)
+{
+ tUDI_Channel *ch = *(tUDI_Channel**)(gcb->channel);
+ ASSERTCR(ch->MetaLang, ==, metalang, NULL);
+
+ struct sUDI_ChannelSide *newside = (gcb->channel == (udi_channel_t)&ch->Side[0].BackPtr ? &ch->Side[1] : &ch->Side[0]);
+
+// gcb->initiator_context = gcb->context;
+ gcb->channel = (udi_channel_t)&newside->BackPtr;
+ gcb->context = newside->Context;
+ return newside->Ops;
+}
+
+++ /dev/null
-/**
- * \file imc.c
- * \author John Hodge (thePowersGang)
- */
-#include <acess.h>
-#include <udi.h>
-
-// === EXPORTS ===
-EXPORT(udi_channel_anchor);
-EXPORT(udi_channel_spawn);
-EXPORT(udi_channel_set_context);
-EXPORT(udi_channel_op_abort);
-EXPORT(udi_channel_close);
-EXPORT(udi_channel_event_ind);
-EXPORT(udi_channel_event_complete);
-
-// === CODE ===
-/**
- */
-void udi_channel_anchor(
- udi_channel_anchor_call_t *callback, udi_cb_t *gcb,
- udi_channel_t channel, udi_index_t ops_idx, void *channel_context
- )
-{
- Warning("%s Unimplemented", __func__);
-}
-
-/**
- */
-extern void udi_channel_spawn(
- udi_channel_spawn_call_t *callback, udi_cb_t *gcb,
- udi_channel_t channel, udi_index_t spawn_idx,
- udi_index_t ops_idx, void *channel_context
- )
-{
- Warning("%s Unimplemented", __func__);
-}
-
-/**
- *
- */
-void udi_channel_set_context(
- udi_channel_t target_channel, void *channel_context
- )
-{
- Warning("%s Unimplemented", __func__);
-}
-
-void udi_channel_op_abort(
- udi_channel_t target_channel, udi_cb_t *orig_cb
- )
-{
- Warning("%s Unimplemented", __func__);
-}
-
-void udi_channel_close(udi_channel_t channel)
-{
- Warning("%s Unimplemented", __func__);
-}
-
-void udi_channel_event_ind(udi_channel_event_cb_t *cb)
-{
- udi_channel_event_complete(cb, UDI_OK);
-}
-
-void udi_channel_event_complete(udi_channel_event_cb_t *cb, udi_status_t status)
-{
- Warning("%s Unimplemented", __func__);
-}
--- /dev/null
+/*
+ */
+#ifndef _UDI_PHYSIO_DMA_H_
+#define _UDI_PHYSIO_DMA_H_
+
+//typedef struct udi_dma_handle_s *udi_dma_handle_t;
+//#define UDI_NULL_DMA_HANDLE NULL
+
+extern void udi_dma_limits(udi_dma_limits_t *dma_limits);
+
+typedef void udi_dma_prepare_call_t(udi_cb_t *gcb, udi_dma_handle_t new_dma_handle);
+typedef void udi_dma_buf_map_call_t(udi_cb_t *gcb, udi_scgth_t *scgth, udi_boolean_t complete, udi_status_t status);
+typedef void udi_dma_mem_alloc_call_t(udi_cb_t *gcb, udi_dma_handle_t new_dma_handle, void *mem_ptr, udi_size_t actual_gap, udi_boolean_t single_element, udi_scgth_t *scgth, udi_boolean_t must_swap);
+typedef void udi_dma_sync_call_t(udi_cb_t *gcb);
+typedef void udi_dma_scgth_sync_call_t(udi_cb_t *gcb);
+typedef void udi_dma_mem_to_buf_call_t(udi_cb_t *gcb, udi_buf_t *new_dst_buf);
+
+/**
+ * \name Values for flags (udi_dma_prepare, udi_dma_buf_map)
+ * \{
+ */
+#define UDI_DMA_OUT (1U<<2)
+#define UDI_DMA_IN (1U<<3)
+#define UDI_DMA_REWIND (1U<<4)
+#define UDI_DMA_BIG_ENDIAN (1U<<5)
+#define UDI_DMA_LITTLE_ENDIAN (1U<<6)
+#define UDI_DMA_NEVERSWAP (1U<<7)
+/**
+ * \}
+ */
+
+extern void udi_dma_prepare(udi_dma_prepare_call_t *callback, udi_cb_t *gcb,
+ udi_dma_constraints_t constraints, udi_ubit8_t flags);
+
+extern void udi_dma_buf_map(udi_dma_buf_map_call_t *callback, udi_cb_t *gcb, udi_dma_handle_t dma_handle,
+ udi_buf_t *buf, udi_size_t offset, udi_size_t len, udi_ubit8_t flags);
+
+extern udi_buf_t *udi_dma_buf_unmap(udi_dma_handle_t dma_handle, udi_size_t new_buf_size);
+
+extern void udi_dma_mem_alloc(udi_dma_mem_alloc_call_t *callback, udi_cb_t *gcb,
+ udi_dma_constraints_t constraints, udi_ubit8_t flags,
+ udi_ubit16_t nelements, udi_size_t element_size, udi_size_t max_gap);
+
+extern void udi_dma_sync(udi_dma_sync_call_t *callback, udi_cb_t *gcb, udi_dma_handle_t dma_handle,
+ udi_size_t offset, udi_size_t len, udi_ubit8_t flags);
+
+extern void udi_dma_scgth_sync(udi_dma_scgth_sync_call_t *callback, udi_cb_t *gcb, udi_dma_handle_t dma_handle);
+
+extern void udi_dma_mem_barrier(udi_dma_handle_t dma_handle);
+
+extern void udi_dma_free(udi_dma_handle_t dma_handle);
+
+extern void udi_dma_mem_to_buf(udi_dma_mem_to_buf_call_t *callback, udi_cb_t *gcb, udi_dma_handle_t dma_handle,
+ udi_size_t src_off, udi_size_t src_len, udi_buf_t *dst_buf);
+
+#endif
+
--- /dev/null
+/*
+ *
+ */
+#ifndef _UDI_DMA_CONST_H_
+#define _UDI_DMA_CONST_H_
+
+typedef void udi_dma_constraints_attr_set_call_t(udi_cb_t *gcb, udi_dma_constraints_t new_constraints, udi_status_t status);
+
+/**
+ * \name Flags for udi_dma_constraints_attr_set
+ * \{
+ */
+#define UDI_DMA_CONSTRAINTS_COPY (1U<<0)
+/**
+ * \}
+ */
+
+extern void udi_dma_constraints_attr_set(udi_dma_constraints_attr_set_call_t *callback, udi_cb_t *gcb,
+ udi_dma_constraints_t src_constraints,
+ const udi_dma_constraints_attr_spec_t *attr_list, udi_ubit16_t list_length,
+ udi_ubit8_t flags);
+
+extern void udi_dma_constraints_attr_reset(udi_dma_constraints_t constraints, udi_dma_constraints_attr_t attr_type);
+
+extern void udi_dma_constraints_free(udi_dma_constraints_t constraints);
+
+#endif
extern void udi_intr_attach_req(udi_intr_attach_cb_t *intr_attach_cb);
extern void udi_intr_attach_ack(udi_intr_attach_cb_t *intr_attach_cb, udi_status_t status);
-extern void udi_intr_attach_ack_unused(udi_intr_attach_cb_t *intr_attach_cb, udi_status_t status);
+//extern void udi_intr_attach_ack_unused(udi_intr_attach_cb_t *intr_attach_cb, udi_status_t status);
extern void udi_intr_detach_req(udi_intr_detach_cb_t *intr_detach_cb);
extern void udi_intr_detach_ack(udi_intr_detach_cb_t *intr_detach_cb);
-extern void udi_intr_detach_ack_unused(udi_intr_detach_cb_t *intr_detach_cb);
+//extern void udi_intr_detach_ack_unused(udi_intr_detach_cb_t *intr_detach_cb);
extern void udi_intr_event_ind(udi_intr_event_cb_t *intr_event_cb, udi_ubit8_t flags);
#include <udi.h>
#include <udi_physio.h>
-
-
typedef _udi_handle_t udi_pio_handle_t;
/* Null handle value for udi_pio_handle_t */
#define UDI_NULL_PIO_HANDLE _NULL_HANDLE
+typedef void udi_pio_map_call_t(udi_cb_t *gcb, udi_pio_handle_t new_pio_handle);
+
+typedef const struct {
+ udi_ubit8_t pio_op;
+ udi_ubit8_t tran_size;
+ udi_ubit16_t operand;
+} udi_pio_trans_t;
+
+/**
+ * \brief Values for tran_size
+ */
+enum {
+ UDI_PIO_1BYTE,
+ UDI_PIO_2BYTE,
+ UDI_PIO_4BYTE,
+ UDI_PIO_8BYTE,
+ UDI_PIO_16BYTE,
+ UDI_PIO_32BYTE,
+};
+
+//! \brief PIO Handle Layout Element Type Code
+#define UDI_DL_PIO_HANDLE_T 200
+
+/**
+ * \name PIO Handle Allocation and Initialisation
+ * \{
+ */
+
+/**
+ * \name Values for pio_attributes of udi_pio_map
+ * \{
+ */
+#define UDI_PIO_STRICTORDER (1U<<0)
+#define UDI_PIO_UNORDERED_OK (1U<<1)
+#define UDI_PIO_MERGING_OK (1U<<2)
+#define UDI_PIO_LOADCACHING_OK (1U<<3)
+#define UDI_PIO_STORECACHING_OK (1U<<4)
+#define UDI_PIO_BIG_ENDIAN (1U<<5)
+#define UDI_PIO_LITTLE_ENDIAN (1U<<6)
+#define UDI_PIO_NEVERSWAP (1U<<7)
+#define UDI_PIO_UNALIGNED (1U<<8)
+/**
+ * \}
+ */
+
+extern void udi_pio_map(udi_pio_map_call_t *callback, udi_cb_t *gcb,
+ udi_ubit32_t regset_idx, udi_ubit32_t base_offset, udi_ubit32_t length,
+ udi_pio_trans_t *trans_list, udi_ubit16_t list_length,
+ udi_ubit16_t pio_attributes, udi_ubit32_t pace, udi_index_t serialization_domain);
+
+extern void udi_pio_unmap(udi_pio_handle_t pio_handle);
+
+extern udi_ubit32_t udi_pio_atmic_sizes(udi_pio_handle_t pio_handle);
+
+extern void udi_pio_abort_sequence(udi_pio_handle_t pio_handle, udi_size_t scratch_requirement);
+
+/**
+ * \}
+ */
+
+/**
+ * \name PIO Access Service Calls
+ * \{
+ */
+typedef void udi_pio_trans_call_t(udi_cb_t *gcb, udi_buf_t *new_buf, udi_status_t status, udi_ubit16_t result);
+
+extern void udi_pio_trans(udi_pio_trans_call_t *callback, udi_cb_t *gcb,
+ udi_pio_handle_t pio_handle, udi_index_t start_label,
+ udi_buf_t *buf, void *mem_ptr);
+
+typedef void udi_pio_probe_call_t(udi_cb_t *gcb, udi_status_t status);
+
+/**
+ * \name Values for direction
+ * \{
+ */
+#define UDI_PIO_IN 0x00
+#define UDI_PIO_OUT 0x20
+/**
+ * \}
+ */
+
+extern void udi_pio_probe(udi_pio_probe_call_t *callback, udi_cb_t *gcb,
+ udi_pio_handle_t pio_handle, void *mem_ptr, udi_ubit32_t pio_offset,
+ udi_ubit8_t tran_size, udi_ubit8_t direction);
+
+/**
+ * \}
+ */
+
#endif
*/
+typedef struct udi_init_s udi_init_t;
+typedef struct udi_primary_init_s udi_primary_init_t;
+typedef struct udi_secondary_init_s udi_secondary_init_t;
+typedef struct udi_ops_init_s udi_ops_init_t;
+typedef struct udi_cb_init_s udi_cb_init_t;
+typedef struct udi_cb_select_s udi_cb_select_t;
+typedef struct udi_gcb_init_s udi_gcb_init_t;
+
+typedef struct udi_init_context_s udi_init_context_t;
+typedef struct udi_limits_s udi_limits_t;
+typedef struct udi_chan_context_s udi_chan_context_t;
+typedef struct udi_child_chan_context_s udi_child_chan_context_t;
+
+typedef void udi_op_t(void);
+typedef udi_op_t * const udi_ops_vector_t;
+
// === INCLUDE SUB-SECTIONS ===
#include "udi/cb.h" // Control Blocks
+#include "udi/time.h" // Timer Services
#include "udi/log.h" // Logging
#include "udi/attr.h" // Attributes
#include "udi/strmem.h" // String/Memory
+#include "udi/queues.h" // Queues
#include "udi/buf.h" // Buffers
#include "udi/mem.h" // Memory Management
#include "udi/imc.h" // Inter-module Communication
*/
void *scratch;
/**
- * \brief ???
+ * \brief Source-usable value
*/
void *initiator_context;
/**
#ifndef _UDI_INIT_H_
#define _UDI_INIT_H_
-typedef struct udi_init_s udi_init_t;
-typedef struct udi_primary_init_s udi_primary_init_t;
-typedef struct udi_secondary_init_s udi_secondary_init_t;
-typedef struct udi_ops_init_s udi_ops_init_t;
-typedef struct udi_cb_init_s udi_cb_init_t;
-typedef struct udi_cb_select_s udi_cb_select_t;
-typedef struct udi_gcb_init_s udi_gcb_init_t;
-
-typedef struct udi_init_context_s udi_init_context_t;
-typedef struct udi_limits_s udi_limits_t;
-typedef struct udi_chan_context_s udi_chan_context_t;
-typedef struct udi_child_chan_context_s udi_child_chan_context_t;
-
-typedef void udi_op_t(void);
-typedef udi_op_t * const udi_ops_vector_t;
-
/**
* \brief UDI Initialisation Structure
*
*/
typedef udi_ubit32_t udi_trevent_t;
+/**
+ * \name Values for udi_trevent_t
+ * \note Taken from UDI Spec 1.01
+ * \{
+ */
+/* Common Trace Events */
+#define UDI_TREVENT_LOCAL_PROC_ENTRY (1U<<0)
+#define UDI_TREVENT_LOCAL_PROC_EXIT (1U<<1)
+#define UDI_TREVENT_EXTERNAL_ERROR (1U<<2)
+/* Common Metalanguage-Selectable Trace Events */
+#define UDI_TREVENT_IO_SCHEDULED (1U<<6)
+#define UDI_TREVENT_IO_COMPLETED (1U<<7)
+/* Metalanguage-Specific Trace Events */
+#define UDI_TREVENT_META_SPECIFIC_1 (1U<<11)
+#define UDI_TREVENT_META_SPECIFIC_2 (1U<<12)
+#define UDI_TREVENT_META_SPECIFIC_3 (1U<<13)
+#define UDI_TREVENT_META_SPECIFIC_4 (1U<<14)
+#define UDI_TREVENT_META_SPECIFIC_5 (1U<<15)
+/* Driver-Specific Trace Events */
+#define UDI_TREVENT_INTERNAL_1 (1U<<16)
+#define UDI_TREVENT_INTERNAL_2 (1U<<17)
+#define UDI_TREVENT_INTERNAL_3 (1U<<18)
+#define UDI_TREVENT_INTERNAL_4 (1U<<19)
+#define UDI_TREVENT_INTERNAL_5 (1U<<20)
+#define UDI_TREVENT_INTERNAL_6 (1U<<21)
+#define UDI_TREVENT_INTERNAL_7 (1U<<22)
+#define UDI_TREVENT_INTERNAL_8 (1U<<23)
+#define UDI_TREVENT_INTERNAL_9 (1U<<24)
+#define UDI_TREVENT_INTERNAL_10 (1U<<25)
+#define UDI_TREVENT_INTERNAL_11 (1U<<26)
+#define UDI_TREVENT_INTERNAL_12 (1U<<27)
+#define UDI_TREVENT_INTERNAL_13 (1U<<28)
+#define UDI_TREVENT_INTERNAL_14 (1U<<29)
+#define UDI_TREVENT_INTERNAL_15 (1U<<30)
+/* Logging Event */
+#define UDI_TREVENT_LOG (1U<<31)
+
/**
* \brief Log Callback
*/
* \}
*/
+extern void udi_trace_write(udi_init_context_t *init_context,
+ udi_trevent_t trace_event, udi_index_t meta_idx,
+ udi_ubit32_t msgnum, ...);
+
+extern void udi_log_write( udi_log_write_call_t *callback, udi_cb_t *gcb,
+ udi_trevent_t trace_event, udi_ubit8_t severity, udi_index_t meta_idx, udi_status_t original_status,
+ udi_ubit32_t msgnum, ... );
+
+extern void udi_assert(udi_boolean_t expr);
+
+extern void udi_debug_break(udi_init_context_t *init_context, const char *message);
+
+extern void udi_debug_printf(const char *format, ...);
#endif
#define UDI_RESOURCES_PLENTIFUL 4
/* Proxy */
extern void udi_static_usage(udi_usage_cb_t *cb, udi_ubit8_t resource_level);
+
+extern void udi_usage_ind(udi_usage_cb_t *cb, udi_ubit8_t resource_level);
/**
* \}
*/
typedef void udi_usage_res_op_t(udi_usage_cb_t *cb);
+extern void udi_usage_res(udi_usage_cb_t *cb);
+
/**
* \name Enumerate this driver
* \{
*/
typedef void udi_enumerate_req_op_t(udi_enumerate_cb_t *cb, udi_ubit8_t enumeration_level);
+extern void udi_enumerate_req(udi_enumerate_cb_t *cb, udi_ubit8_t enumeration_level);
/* Values for enumeration_level */
#define UDI_ENUMERATE_START 1
#define UDI_ENUMERATE_START_RESCAN 2
#define UDI_ENUMERATE_REMOVED_SELF 5
#define UDI_ENUMERATE_RELEASED 6
#define UDI_ENUMERATE_FAILED 255
+extern void udi_enumerate_ack(udi_enumerate_cb_t *cb, udi_ubit8_t enumeration_result, udi_index_t ops_idx);
/**
* \}
*/
--- /dev/null
+/**
+ * \file udi_queues.h
+ * \brief Queue Management Utility Functions
+ */
+#ifndef _UDI_QUEUES_H_
+#define _UDI_QUEUES_H_
+
+typedef struct udi_queue udi_queue_t;
+
+struct udi_queue
+{
+ struct udi_queue *next;
+ struct udi_queue *prev;
+};
+
+extern void udi_enqueue(udi_queue_t *new_el, udi_queue_t *old_el);
+extern udi_queue_t *udi_dequeue(udi_queue_t *element);
+
+#define UDI_QUEUE_INIT(listhead) ((listhead)->next = (listhead)->prev = (listhead))
+#define UDI_QUEUE_EMPTY(listhead) ((listhead)->next == (listhead)->prev)
+// TODO: other queue macros
+
+#endif
+
extern udi_size_t udi_snprintf(char *s, udi_size_t max_bytes, const char *format, ...);
+extern udi_size_t udi_vsnprintf(char *s, udi_size_t max_bytes, const char *format, va_list ap);
--- /dev/null
+
+#ifndef _UDI_TIME_H_
+#define _UDI_TIME_H_
+
+typedef struct {
+ udi_ubit32_t seconds;
+ udi_ubit32_t nanoseconds;
+} udi_time_t;
+
+typedef void udi_timer_expired_call_t(udi_cb_t *gcb);
+typedef void udi_timer_tick_call_t(udi_cb_t *gcb, udi_ubit32_t missed);
+
+extern void udi_timer_start(udi_timer_expired_call_t *callback, udi_cb_t *gcb, udi_time_t interval);
+extern void udi_timer_start_repeating(udi_timer_tick_call_t *callback, udi_cb_t *gcb, udi_time_t interval);
+extern void udi_timer_cancel(udi_cb_t *gcb);
+
+extern udi_timestamp_t udi_time_current(void);
+extern udi_time_t udi_time_between(udi_timestamp_t start_time, udi_timestamp_t end_time);
+extern udi_time_t udi_time_since(udi_timestamp_t start_time);
+
+#endif
+
// === FUNCTIONS ===
-// --- DMA Constraints Management ---
-extern void udi_dma_constraints_attr_set(
- udi_dma_constraints_attr_set_call_t *callback,
- udi_cb_t *gcb,
- udi_dma_constraints_t src_constraints,
- const udi_dma_constraints_attr_spec_t *attr_list,
- udi_ubit16_t list_length,
- udi_ubit8_t flags
- );
-/* Constraints Flags */
-#define UDI_DMA_CONSTRAINTS_COPY (1U<<0)
-
-extern void udi_dma_constraints_attr_reset(
- udi_dma_constraints_t constraints,
- udi_dma_constraints_attr_t attr_type
- );
-
-extern void udi_dma_constraints_free(udi_dma_constraints_t constraints);
-
+#include <physio/dma_const.h>
+#include <physio/dma.h>
#include <physio/meta_intr.h>
#include <physio/meta_bus.h>
-
+#include <physio/pio.h>
#endif
--- /dev/null
+/**
+ * \file udi_scsi.h
+ * \brief UDI SCSI Bindings
+ */
+#ifndef _UDI_SCSI_H_
+#define _UDI_SCSI_H_
+
+typedef struct {
+ udi_cb_t gcb;
+ udi_ubit16_t events;
+} udi_scsi_bind_cb_t;
+
+#define UDI_SCSI_BIND_CB_NUM 1
+
+/* SCSI Events */
+#define UDI_SCSI_EVENT_AEN (1U<<0)
+#define UDI_SCSI_EVENT_TGT_RESET (1U<<1)
+#define UDI_SCSI_EVENT_BUS_RESET (1U<<2)
+#define UDI_SCSI_EVENT_UNSOLICITED_RESELECT (1U<<3)
+
+typedef struct {
+ udi_cb_t gcb;
+ udi_buf_t *data_buf;
+ udi_ubit32_t timeout;
+ udi_ubit16_t flags;
+ udi_ubit8_t attribute;
+ udi_ubit8_t cdb_len;
+ udi_ubit8_t *cdb_ptr;
+} udi_scsi_io_cb_t;
+/* Control Block Group Number */
+#define UDI_SCSI_IO_CB_NUM 2
+/* I/O Request Flags */
+#define UDI_SCSI_DATA_IN (1U<<0)
+#define UDI_SCSI_DATA_OUT (1U<<1)
+#define UDI_SCSI_NO_DISCONNECT (1U<<2)
+/* SCSI Task Attributes */
+#define UDI_SCSI_SIMPLE_TASK 1
+#define UDI_SCSI_ORDERED_TASK 2
+#define UDI_SCSI_HEAD_OF_Q_TASK 3
+#define UDI_SCSI_ACA_TASK 4
+#define UDI_SCSI_UNTAGGED_TASK 5
+
+typedef struct {
+ udi_status_t req_status;
+ udi_ubit8_t scsi_status;
+ udi_ubit8_t sense_status;
+} udi_scsi_status_t;
+
+typedef struct {
+ udi_cb_t gcb;
+ udi_ubit8_t ctrl_func;
+ udi_ubit16_t queue_depth;
+} udi_scsi_ctl_cb_t;
+/* Values for ctrl_func */
+#define UDI_SCSI_CTL_ABORT_TASK_SET 1
+#define UDI_SCSI_CTL_CLEAR_TASK_SET 2
+#define UDI_SCSI_CTL_LUN_RESET 3
+#define UDI_SCSI_CTL_TGT_RESET 4
+#define UDI_SCSI_CTL_BUS_RESET 5
+#define UDI_SCSI_CTL_CLEAR_ACA 6
+#define UDI_SCSI_CTL_SET_QUEUE_DEPTH 7
+/* Control Block Group Number */
+#define UDI_SCSI_CTL_CB_NUM 3
+
+typedef struct {
+ udi_cb_t gcb;
+ udi_ubit8_t event;
+ udi_buf_t *aen_data_buf;
+} udi_scsi_event_cb_t;
+/* Control Block Group Number */
+#define UDI_SCSI_EVENT_CB_NUM 4
+
+typedef void udi_scsi_bind_ack_op_t(udi_scsi_bind_cb_t *cb, udi_ubit32_t hd_timeout_increase, udi_status_t status);
+typedef void udi_scsi_unbind_ack_op_t(udi_scsi_bind_cb_t *cb);
+typedef void udi_scsi_io_ack_op_t(udi_scsi_io_cb_t *cb);
+typedef void udi_scsi_io_nak_op_t(udi_scsi_io_cb_t *cb);
+typedef void udi_scsi_ctl_ack_op_t(udi_scsi_ctl_cb_t *cb, udi_status_t status);
+typedef void udi_scsi_event_ind_op_t(udi_scsi_event_cb_t *cb);
+
+typedef void udi_scsi_bind_req_op_t(udi_scsi_bind_cb_t *cb,
+ udi_ubit16_t bind_flags, udi_ubit16_t queue_depth,
+ udi_ubit16_t max_sense_len, udi_ubit16_t aen_buf_size);
+typedef void udi_scsi_unbind_req_op_t(udi_scsi_bind_cb_t *cb);
+typedef void udi_scsi_io_req_op_t(udi_scsi_io_cb_t *cb);
+typedef void udi_scsi_ctl_req_op_t(udi_scsi_ctl_cb_t *cb);
+typedef void udi_scsi_event_res_op_t(udi_scsi_event_cb_t *cb);
+
+typedef const struct {
+ udi_channel_event_ind_op_t *channel_event_ind_op;
+ udi_scsi_bind_ack_op_t *bind_ack_op;
+ udi_scsi_unbind_ack_op_t *unbind_ack_op;
+ udi_scsi_io_ack_op_t *io_ack_op;
+ udi_scsi_io_nak_op_t *io_nak_op;
+ udi_scsi_ctl_ack_op_t *ctl_ack_op;
+ udi_scsi_event_ind_op_t *event_ind_op;
+} udi_scsi_pd_ops_t;
+
+#define UDI_SCSI_PD_OPS_NUM 1
+
+typedef const struct {
+ udi_channel_event_ind_op_t *channel_event_ind_op;
+ udi_scsi_bind_req_op_t *bind_req_op;
+ udi_scsi_unbind_req_op_t *unbind_req_op;
+ udi_scsi_io_req_op_t *io_req_op;
+ udi_scsi_ctl_req_op_t *ctl_req_op;
+ udi_scsi_event_res_op_t *event_res_op;
+} udi_scsi_hd_ops_t;
+
+#define UDI_SCSI_HD_OPS_NUM 2
+
+/* Bind Flags */
+#define UDI_SCSI_BIND_EXCLUSIVE (1U<<0)
+#define UDI_SCSI_TEMP_BIND_EXCLUSIVE (1U<<1)
+
+extern void udi_scsi_bind_req(udi_scsi_bind_cb_t *cb,
+ udi_ubit16_t bind_flags, udi_ubit16_t queue_depth,
+ udi_ubit16_t max_sense_len, udi_ubit16_t aen_buf_size);
+extern void udi_scsi_bind_ack(udi_scsi_bind_cb_t *cb, udi_ubit32_t hd_timeout_increase, udi_status_t status);
+extern void udi_scsi_unbind_req(udi_scsi_bind_cb_t *cb);
+extern void udi_scsi_unbind_ack(udi_scsi_bind_cb_t *cb);
+
+extern void udi_scsi_io_req(udi_scsi_io_cb_t *cb);
+extern void udi_scsi_io_ack(udi_scsi_io_cb_t *cb);
+extern void udi_scsi_io_nak(udi_scsi_io_cb_t *cb, udi_scsi_status_t status, udi_buf_t *sense_buf);
+extern void udi_scsi_ctl_req(udi_scsi_ctl_cb_t *cb);
+extern void udi_scsi_ctl_ack(udi_scsi_ctl_cb_t *cb, udi_status_t status);
+extern void udi_scsi_event_ind(udi_scsi_event_cb_t *cb);
+extern udi_scsi_event_ind_op_t udi_scsi_event_ind_unused;
+extern void udi_scsi_event_res(udi_scsi_event_cb_t *cb);
+extern void udi_scsi_inquiry_to_string(const udi_ubit8_t *inquiry_data, udi_size_t inquiry_len, char *str);
+
+
+#endif
+
+++ /dev/null
-/**
- * \file logging.c
- * \author John Hodge (thePowersGang)
- */
-#include <acess.h>
-#include <udi.h>
-
-// === PROTOTYPES ===
-
-// === CODE ===
-void udi_log_write( udi_log_write_call_t *callback, udi_cb_t *gcb,
- udi_trevent_t trace_event, udi_ubit8_t severity, udi_index_t meta_idx,
- udi_status_t original_status, udi_ubit32_t msgnum, ... )
-{
- Log("UDI Log");
-}
-
-EXPORT(udi_log_write);
#include <acess.h>
#include <modules.h>
#include <udi.h>
+#include "udi_internal.h"
// === PROTOTYPES ===
int UDI_Install(char **Arguments);
int UDI_DetectDriver(void *Base);
int UDI_LoadDriver(void *Base);
+tUDI_DriverInstance *UDI_CreateInstance(tUDI_DriverModule *DriverModule);
+tUDI_DriverRegion *UDI_InitRegion(tUDI_DriverInstance *Inst, udi_ubit16_t Index, udi_ubit16_t Type, size_t RDataSize);
+
// === GLOBALS ===
MODULE_DEFINE(0, VERSION, UDI, UDI_Install, NULL, NULL);
tModuleLoader gUDI_Loader = {
*/
int UDI_DetectDriver(void *Base)
{
- if( Binary_FindSymbol(Base, "udi_init_info", NULL) == 0) {
+ Uint unused;
+
+ if( Binary_FindSymbol(Base, "udi_init_info", &unused) == 0) {
+ return 0;
+ }
+ if( Binary_FindSymbol(Base, "_udiprops", &unused) == 0 ) {
+ Log_Warning("UDI", "Driver has udi_init_info, but no _udiprops symbol");
+ return 0;
+ }
+ if( Binary_FindSymbol(Base, "_udiprops_end", &unused) == 0) {
+ Log_Warning("UDI", "Driver has udi_init_info, but no _udiprops_end symbol");
return 0;
}
{
udi_init_t *info;
char *udiprops = NULL;
- Uint udiprops_size = 0;
- int i;
- // int j;
+ char *udiprops_end = 0;
ENTER("pBase", Base);
return 0;
}
- if( Binary_FindSymbol(Base, "_udiprops", (Uint*)&udiprops) == 0 ) {
- Log_Warning("UDI", "_udiprops is not defined, this is usually bad");
- }
- else if( Binary_FindSymbol(Base, "_udiprops_size", &udiprops_size) == 0) {
- Log_Warning("UDI", "_udiprops_size is not defined");
- }
- else {
- int i, j, nLines;
- char **udipropsptrs;
-
- Log_Debug("UDI", "udiprops = %p, udiprops_size = 0x%x", udiprops, udiprops_size);
-
- Debug_HexDump("UDI_LoadDriver", udiprops, udiprops_size);
-
- nLines = 1;
- for( i = 0; i < udiprops_size; i++ )
- {
- if( udiprops[i] == '\0' )
- nLines ++;
- }
-
- Log_Debug("UDI", "nLines = %i", nLines);
-
- udipropsptrs = malloc( sizeof(char*)*nLines );
- udipropsptrs[0] = udiprops;
- j = 0;
- for( i = 0; i < udiprops_size; i++ )
- {
- if( udiprops[i] == '\0' ) {
- //Log_Debug("UDI", "udipropsptrs[%i] = '%s'", j, udipropsptrs[j]);
- udipropsptrs[j++] = &udiprops[i+1];
- }
- }
- Log_Debug("UDI", "udipropsptrs[%i] = '%s'", j, udipropsptrs[j]);
- Log_Debug("UDI", "udiprops = \"%s\"", udiprops);
- }
-
-
+ Binary_FindSymbol(Base, "_udiprops", (Uint*)&udiprops);
+ Binary_FindSymbol(Base, "_udiprops_end", (Uint*)&udiprops_end);
+
+ #if 0
Log("primary_init_info = %p = {", info->primary_init_info);
{
Log(" .mgmt_ops = %p = {", info->primary_init_info->mgmt_ops);
Log(" .per_parent_paths = 0x%x", info->primary_init_info->per_parent_paths);
}
Log("}");
- Log("secondary_init_list = %p", info->secondary_init_list);
+ Log("secondary_init_list = %p {", info->secondary_init_list);
+ for( int i = 0; info->secondary_init_list && info->secondary_init_list[i].region_idx; i ++ )
+ {
+ Log(" [%i] = { .region_idx=%i, .rdata_size=0x%x }",
+ info->secondary_init_list[i].region_idx, info->secondary_init_list[i].rdata_size);
+ }
+ LOG("}");
Log("ops_init_list = %p", info->ops_init_list);
- for( i = 0; info->ops_init_list[i].ops_idx; i++ )
+ for( int i = 0; info->ops_init_list[i].ops_idx; i++ )
{
Log("info->ops_init_list[%i] = {", i);
Log(" .ops_idx = 0x%x", info->ops_init_list[i].ops_idx);
// Log(" .op_flags = %p", info->ops_init_list[i].op_flags);
Log("}");
}
+ #endif
+
+
+ // TODO: Multiple modules?
+ tUDI_DriverModule *driver_module = NEW(tUDI_DriverModule,);
+ driver_module->InitInfo = info;
+
+ // - Parse udiprops
+ {
+ char **udipropsptrs;
+
+ Log_Debug("UDI", "udiprops = %p, udiprops_end = %p", udiprops, udiprops_end);
+ size_t udiprops_size = udiprops_end - udiprops;
+
+ int nLines = 1;
+ for( int i = 0; i < udiprops_size; i++ )
+ {
+ if( udiprops[i] == '\0' )
+ nLines ++;
+ }
+
+ Log_Debug("UDI", "nLines = %i", nLines);
+
+ udipropsptrs = NEW(char*,*nLines);
+ int line = 0;
+ udipropsptrs[line++] = udiprops;
+ for( int i = 0; i < udiprops_size; i++ )
+ {
+ if( udiprops[i] == '\0' ) {
+ udipropsptrs[line++] = &udiprops[i+1];
+ }
+ }
+ if(udipropsptrs[line-1] == &udiprops[udiprops_size])
+ nLines --;
+
+ for( int i = 0; i < nLines; i ++ )
+ {
+ }
+
+ // Parse out:
+ // 'message' into driver_module->Messages
+ // 'region' into driver_module->RegionTypes
+ // 'module' into driver_module->ModuleName
+
+ int nMessages = 0;
+ int nLocales = 1;
+ int nRegionTypes = 0;
+ for( int i = 0; i < nLines; i ++ )
+ {
+ const char *str = udipropsptrs[i];
+ if( strncmp("module ", str, 7) == 0 ) {
+ driver_module->ModuleName = str + 7;
+ }
+ else if( strncmp("message ", str, 8) == 0 ) {
+ nMessages ++;
+ }
+ else if( strncmp("locale ", str, 7) == 0 ) {
+ nLocales ++;
+ }
+ else if( strncmp("region ", str, 7) == 0 ) {
+ nRegionTypes ++;
+ }
+ }
+
+ // Allocate structures
+ driver_module->nMessages = nMessages;
+ driver_module->Messages = NEW(tUDI_PropMessage, *nMessages);
+ driver_module->nRegionTypes = nRegionTypes;
+ driver_module->RegionTypes = NEW(tUDI_PropRegion, *nRegionTypes);
+
+ // Populate
+ int cur_locale = 0;
+ int msg_index = 0;
+ for( int i = 0; i < nLines; i ++ )
+ {
+ const char *str = udipropsptrs[i];
+ if( strncmp("module ", str, 7) == 0 ) {
+ driver_module->ModuleName = str + 7;
+ }
+ else if( strncmp("message ", str, 8) == 0 ) {
+ tUDI_PropMessage *msg = &driver_module->Messages[msg_index++];
+ char *end;
+ msg->locale = cur_locale;
+ msg->index = strtoul(str+8, &end, 10);
+ if( *end != ' ' && *end != '\t' ) {
+ // Oops.
+ continue ;
+ }
+ while( isspace(*end) )
+ end ++;
+ msg->string = end;
+
+ Log_Debug("UDI", "Message %i/%i: '%s'", msg->locale, msg->index, msg->string);
+ }
+ else if( strncmp("locale ", str, 7) == 0 ) {
+ // TODO: Set locale
+ cur_locale = 1;
+ }
+ else if( strncmp("region ", str, 7) == 0 ) {
+ nRegionTypes ++;
+ }
+ else {
+ Log_Debug("UDI", "udipropsptrs[%i] = '%s'", i, udipropsptrs[i]);
+ }
+ }
+
+ // Sort message list
+ // TODO: Sort message list
+ }
+
+ int nSecondaryRgns = 0;
+ for( int i = 0; info->secondary_init_list && info->secondary_init_list[i].region_idx; i ++ )
+ nSecondaryRgns ++;
+ driver_module->nSecondaryRegions = nSecondaryRgns;
+
+ // Create initial driver instance
+ tUDI_DriverInstance *inst = UDI_CreateInstance(driver_module);
+
+ for( int i = 0; i < 1+driver_module->nSecondaryRegions; i ++ )
+ Log("Rgn %i: %p", i, inst->Regions[i]);
+
+ // Send usage indication
+ udi_usage_cb_t ucb;
+ memset(&ucb, 0, sizeof(ucb));
+ ucb.gcb.channel = inst->ManagementChannel;
+ udi_usage_ind(&ucb, UDI_RESOURCES_NORMAL);
return 0;
}
+
+tUDI_DriverInstance *UDI_CreateInstance(tUDI_DriverModule *DriverModule)
+{
+ tUDI_DriverInstance *inst = NEW_wA(tUDI_DriverInstance, Regions, (1+DriverModule->nSecondaryRegions));
+ inst->Module = DriverModule;
+ inst->Regions[0] = UDI_InitRegion(inst, 0, 0, DriverModule->InitInfo->primary_init_info->rdata_size);
+ udi_secondary_init_t *sec_init = DriverModule->InitInfo->secondary_init_list;
+ if( sec_init )
+ {
+ for( int i = 0; sec_init[i].region_idx; i ++ )
+ {
+ inst->Regions[1+i] = UDI_InitRegion(inst, i, sec_init[i].region_idx, sec_init[i].rdata_size);
+ }
+ }
+
+ inst->ManagementChannel = UDI_CreateChannel(METALANG_MGMT, 0, NULL, 0, inst, 0);
+
+ return inst;
+}
+
+tUDI_DriverRegion *UDI_InitRegion(tUDI_DriverInstance *Inst, udi_ubit16_t Index, udi_ubit16_t Type, size_t RDataSize)
+{
+// ASSERTCR( RDataSize, <=, UDI_MIN_ALLOC_LIMIT, NULL );
+ ASSERTCR( RDataSize, >, sizeof(udi_init_context_t), NULL );
+ tUDI_DriverRegion *rgn = NEW(tUDI_DriverRegion,+RDataSize);
+ rgn->InitContext = (void*)(rgn+1);
+ rgn->InitContext->region_idx = Type;
+// rgn->InitContext->limits
+ return rgn;
+}
+
+++ /dev/null
-/**
- * \file mem.c
- * \author John Hodge (thePowersGang)
- */
-#include <acess.h>
-#include <udi.h>
-
-// === EXPORTS ===
-EXPORT(udi_mem_alloc);
-EXPORT(udi_mem_free);
-
-// === 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);
-}
+++ /dev/null
-/**
- * \file meta_gio.c
- * \author John Hodge (thePowersGang)
- */
-#include <acess.h>
-#include <udi.h>
-
-// === EXPORTS ===
-EXPORT(udi_gio_bind_req);
-EXPORT(udi_gio_bind_ack);
-EXPORT(udi_gio_unbind_req);
-EXPORT(udi_gio_unbind_ack);
-EXPORT(udi_gio_xfer_req);
-EXPORT(udi_gio_xfer_ack);
-EXPORT(udi_gio_xfer_nak);
-EXPORT(udi_gio_event_res);
-EXPORT(udi_gio_event_ind);
-EXPORT(udi_gio_event_res_unused);
-
-// === CODE ===
-void udi_gio_bind_req(udi_gio_bind_cb_t *cb)
-{
- UNIMPLEMENTED();
-}
-void udi_gio_bind_ack(
- udi_gio_bind_cb_t *cb,
- udi_ubit32_t device_size_lo,
- udi_ubit32_t device_size_hi,
- udi_status_t status
- )
-{
- UNIMPLEMENTED();
-}
-
-void udi_gio_unbind_req(udi_gio_bind_cb_t *cb)
-{
- UNIMPLEMENTED();
-}
-void udi_gio_unbind_ack(udi_gio_bind_cb_t *cb)
-{
- UNIMPLEMENTED();
-}
-
-void udi_gio_xfer_req(udi_gio_xfer_cb_t *cb)
-{
- UNIMPLEMENTED();
-}
-void udi_gio_xfer_ack(udi_gio_xfer_cb_t *cb)
-{
- UNIMPLEMENTED();
-}
-void udi_gio_xfer_nak(udi_gio_xfer_cb_t *cb, udi_status_t status)
-{
- UNIMPLEMENTED();
-}
-
-void udi_gio_event_res(udi_gio_event_cb_t *cb)
-{
- UNIMPLEMENTED();
-}
-void udi_gio_event_ind(udi_gio_event_cb_t *cb)
-{
- UNIMPLEMENTED();
-}
-void udi_gio_event_res_unused(udi_gio_event_cb_t *cb)
-{
- UNIMPLEMENTED();
-}
+++ /dev/null
-/**
- * \file meta_mgmt.c
- * \author John Hodge (thePowersGang)
- */
-#include <acess.h>
-#include <udi.h>
-
-// === EXPORTS ===
-EXPORT(udi_devmgmt_req);
-EXPORT(udi_devmgmt_ack);
-EXPORT(udi_final_cleanup_req);
-EXPORT(udi_final_cleanup_ack);
-EXPORT(udi_static_usage);
-EXPORT(udi_enumerate_no_children);
-
-// === CODE ===
-void udi_devmgmt_req(udi_mgmt_cb_t *cb, udi_ubit8_t mgmt_op, udi_ubit8_t parent_ID )
-{
- ENTER("pcb imgmt_op iparent_ID", cb, mgmt_op, parent_ID);
- LEAVE('-');
-}
-
-void udi_devmgmt_ack(udi_mgmt_cb_t *cb, udi_ubit8_t flags, udi_status_t status)
-{
- ENTER("pcb xflags istatus", cb, flags, status);
- LEAVE('-');
-}
-
-void udi_final_cleanup_req(udi_mgmt_cb_t *cb)
-{
- ENTER("pcb", cb);
- LEAVE('-');
-}
-
-void udi_final_cleanup_ack(udi_mgmt_cb_t *cb)
-{
- ENTER("pcb", cb);
- LEAVE('-');
-}
-
-void udi_static_usage(udi_usage_cb_t *cb, udi_ubit8_t resource_level)
-{
- UNIMPLEMENTED();
-}
-
-void udi_enumerate_no_children(udi_enumerate_cb_t *cb, udi_ubit8_t enumeration_level)
-{
- UNIMPLEMENTED();
-}
+++ /dev/null
-/**
- * \file physio.c
- * \author John Hodge (thePowersGang)
- */
-#include <acess.h>
-#include <udi.h>
-#include <udi_physio.h>
-
-// === EXPORTS ===
-EXPORT(udi_dma_constraints_attr_reset);
-EXPORT(udi_dma_constraints_free);
-
-// === CODE ===
-void udi_dma_constraints_attr_reset(
- udi_dma_constraints_t constraints,
- udi_dma_constraints_attr_t attr_type
- )
-{
- UNIMPLEMENTED();
-}
-
-void udi_dma_constraints_free(udi_dma_constraints_t constraints)
-{
- UNIMPLEMENTED();
-}
+++ /dev/null
-/**
- * \file physio/meta_bus.c
- * \author John Hodge (thePowersGang)
- */
-#include <acess.h>
-#include <udi.h>
-#include <udi_physio.h>
-
-// === EXPORTS ===
-EXPORT(udi_bus_unbind_req);
-EXPORT(udi_bus_unbind_ack);
-EXPORT(udi_bus_bind_req);
-EXPORT(udi_bus_bind_ack);
-
-// === CODE ===
-void udi_bus_unbind_req(udi_bus_bind_cb_t *cb)
-{
- UNIMPLEMENTED();
-}
-void udi_bus_unbind_ack(udi_bus_bind_cb_t *cb)
-{
- UNIMPLEMENTED();
-}
-
-void udi_bus_bind_req(udi_bus_bind_cb_t *cb)
-{
- UNIMPLEMENTED();
-}
-
-void udi_bus_bind_ack(
- udi_bus_bind_cb_t *cb,
- udi_dma_constraints_t dma_constraints,
- udi_ubit8_t preferred_endianness,
- udi_status_t status
- )
-{
- UNIMPLEMENTED();
-}
+++ /dev/null
-/**
- * \file physio/meta_intr.c
- * \author John Hodge (thePowersGang)
- */
-#include <acess.h>
-#include <udi.h>
-#include <udi_physio.h>
-
-// === EXPORTS ===
-EXPORT(udi_intr_attach_req);
-EXPORT(udi_intr_attach_ack);
-EXPORT(udi_intr_attach_ack_unused);
-EXPORT(udi_intr_detach_req);
-EXPORT(udi_intr_detach_ack);
-EXPORT(udi_intr_detach_ack_unused);
-EXPORT(udi_intr_event_ind);
-
-// === CODE ===
-void udi_intr_attach_req(udi_intr_attach_cb_t *intr_attach_cb)
-{
- UNIMPLEMENTED();
-}
-void udi_intr_attach_ack(udi_intr_attach_cb_t *intr_attach_cb, udi_status_t status)
-{
- UNIMPLEMENTED();
-}
-void udi_intr_attach_ack_unused(udi_intr_attach_cb_t *intr_attach_cb, udi_status_t status)
-{
- UNIMPLEMENTED();
-}
-
-void udi_intr_detach_req(udi_intr_detach_cb_t *intr_detach_cb)
-{
- UNIMPLEMENTED();
-}
-void udi_intr_detach_ack(udi_intr_detach_cb_t *intr_detach_cb)
-{
- UNIMPLEMENTED();
-}
-void udi_intr_detach_ack_unused(udi_intr_detach_cb_t *intr_detach_cb)
-{
- UNIMPLEMENTED();
-}
-
-void udi_intr_event_ind(udi_intr_event_cb_t *intr_event_cb, udi_ubit8_t flags)
-{
- UNIMPLEMENTED();
-}
+++ /dev/null
-/**
- * \file logging.c
- * \author John Hodge (thePowersGang)
- */
-#include <common.h>
-#include <udi.h>
-#include <udi_physio.h>
-
-// === CODE ===
-void udi_bus_bind_req(udi_bus_bind_cb_t *cb)
-{
-}
-
-void udi_bus_unbind_req(udi_bus_bind_cb_t *cb)
-{
-}
+++ /dev/null
-/**
- * \file strmem.c
- * \author John Hodge (thePowersGang)
- */
-#include <acess.h>
-#include <udi.h>
-
-// === EXPORTS ===
-EXPORT(udi_snprintf);
-
-// === CODE ===
-udi_size_t udi_snprintf(char *s, udi_size_t max_bytes, const char *format, ...)
-{
- udi_size_t ret;
- va_list args;
- va_start(args, format);
-
- ret = vsnprintf(s, max_bytes, format, args);
-
- va_end(args);
- return ret;
-}
--- /dev/null
+/*
+ * Acess2 UDI Layer
+ * - By John Hodge (thePowersGang)
+ *
+ * udi_internal.h
+ * - Definitions for opaque structures
+ */
+#ifndef _UDI_INTERNAL_H_
+#define _UDI_INTERNAL_H_
+
+#define NEW(type,extra) (type*)calloc(sizeof(type)extra,1)
+#define NEW_wA(type,fld,cnt) NEW(type,+(sizeof(((type*)NULL)->fld[0])*cnt))
+
+typedef struct sUDI_PropMessage tUDI_PropMessage;
+typedef struct sUDI_PropRegion tUDI_PropRegion;
+
+typedef struct sUDI_DriverModule tUDI_DriverModule;
+typedef struct sUDI_DriverInstance tUDI_DriverInstance;
+typedef struct sUDI_DriverRegion tUDI_DriverRegion;
+
+struct sUDI_PropMessage
+{
+ int locale;
+ udi_ubit16_t index;
+ const char *string;
+};
+
+struct sUDI_PropRegion
+{
+ enum {
+ UDI_REGIONTYPE_NORMAL,
+ UDI_REGIONTYPE_FP,
+ } Type;
+ enum {
+ UDI_REGIONBINDING_STATIC,
+ UDI_REGIONBINDING_DYNAMIC,
+ } Binding;
+ enum {
+ UDI_REGIONPRIO_MED,
+ UDI_REGIONPRIO_LO,
+ UDI_REGIONPRIO_HI,
+ } Priority;
+ enum {
+ UDI_REGIONLATENCY_NONOVERRRUNABLE,
+ UDI_REGIONLATENCY_POWERFAIL,
+ UDI_REGIONLATENCY_OVERRUNNABLE,
+ UDI_REGIONLATENCY_RETRYABLE,
+ // non_overrunable
+ UDI_REGIONLATENCY_NONCTRITICAL,
+ } Latency;
+ udi_ubit32_t OverrunTime;
+
+
+};
+
+struct sUDI_DriverModule
+{
+ tUDI_DriverModule *Next;
+ void *Base;
+
+ udi_init_t *InitInfo;
+
+ const char *ModuleName;
+ int nMessages;
+ tUDI_PropMessage *Messages; // Sorted list
+
+ int nRegionTypes;
+ tUDI_PropRegion *RegionTypes;
+
+ int nSecondaryRegions;
+};
+
+struct sUDI_DriverInstance
+{
+ tUDI_DriverModule *Module;
+ udi_channel_t ManagementChannel;
+ tUDI_DriverRegion *Regions[];
+};
+
+struct sUDI_DriverRegion
+{
+ udi_init_context_t *InitContext;
+};
+
+enum eUDI_MetaLang
+{
+ METALANG_MGMT,
+ METALANG_BUS
+};
+
+extern udi_channel_t UDI_CreateChannel(enum eUDI_MetaLang metalang, udi_index_t meta_ops_num,
+ tUDI_DriverInstance *ThisEnd, udi_index_t ThisOpsIndex,
+ tUDI_DriverInstance *OtherEnd, udi_index_t OtherOpsIndex);
+
+extern const void *UDI_int_ChannelPrepForCall(udi_cb_t *gcb, enum eUDI_MetaLang metalang);
+
+#endif
+
--- /dev/null
+/**
+ * \file buf.c
+ * \author John Hodge (thePowersGang)
+ *
+ * Buffer Manipulation
+ */
+#include <acess.h>
+#include <udi.h>
+
+// === EXPORTS ===
+EXPORT(udi_buf_copy);
+EXPORT(udi_buf_write);
+EXPORT(udi_buf_read);
+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
+ )
+{
+ UNIMPLEMENTED();
+}
+
+/**
+ * \brief Write to a buffer
+ * \param callback Function to call once the write has completed
+ * \param gcb Control Block
+ * \param src_mem Source Data
+ * \param src_len Length of source data
+ * \param dst_buf Destination buffer
+ * \param dst_off Destination offset in the buffer
+ * \param dst_len Length of destination area (What the?, Redundant
+ * Department of redundacny department)
+ * \param path_handle ???
+ */
+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
+ )
+{
+ UNIMPLEMENTED();
+}
+
+void udi_buf_read(
+ udi_buf_t *src_buf,
+ udi_size_t src_off,
+ udi_size_t src_len,
+ void *dst_mem )
+{
+ UNIMPLEMENTED();
+}
+
+void udi_buf_free(udi_buf_t *buf)
+{
+ UNIMPLEMENTED();
+}
--- /dev/null
+/**
+ * \file cb.c
+ * \author John Hodge (thePowersGang)
+ * \brief Control block code
+ */
+#include <acess.h>
+#include <udi.h>
+
+// === CODE ===
+void udi_cb_alloc (
+ udi_cb_alloc_call_t *callback, //!< Function to be called when the CB is allocated
+ udi_cb_t *gcb, //!< Parent Control Block
+ udi_index_t cb_idx,
+ udi_channel_t default_channel
+ )
+{
+ UNIMPLEMENTED();
+}
+
+void udi_cb_alloc_dynamic(
+ udi_cb_alloc_call_t *callback,
+ udi_cb_t *gcb,
+ udi_index_t cb_idx,
+ udi_channel_t default_channel,
+ udi_size_t inline_size,
+ udi_layout_t *inline_layout
+ )
+{
+ UNIMPLEMENTED();
+}
+
+void udi_cb_alloc_batch(
+ udi_cb_alloc_batch_call_t *callback, //!<
+ udi_cb_t *gcb, //!<
+ udi_index_t cb_idx,
+ udi_index_t count,
+ udi_boolean_t with_buf,
+ udi_size_t buf_size,
+ udi_buf_path_t path_handle
+ )
+{
+ UNIMPLEMENTED();
+}
+
+void udi_cb_free(udi_cb_t *cb)
+{
+ UNIMPLEMENTED();
+}
+
+void udi_cancel(udi_cancel_call_t *callback, udi_cb_t *gcb)
+{
+ UNIMPLEMENTED();
+}
+
+// === EXPORTS ===
+EXPORT(udi_cb_alloc);
+EXPORT(udi_cb_alloc_dynamic);
+EXPORT(udi_cb_alloc_batch);
+EXPORT(udi_cb_free);
+EXPORT(udi_cancel);
--- /dev/null
+/**
+ * \file imc.c
+ * \author John Hodge (thePowersGang)
+ */
+#include <acess.h>
+#include <udi.h>
+
+// === EXPORTS ===
+EXPORT(udi_channel_anchor);
+EXPORT(udi_channel_spawn);
+EXPORT(udi_channel_set_context);
+EXPORT(udi_channel_op_abort);
+EXPORT(udi_channel_close);
+EXPORT(udi_channel_event_ind);
+EXPORT(udi_channel_event_complete);
+
+// === CODE ===
+/**
+ */
+void udi_channel_anchor(
+ udi_channel_anchor_call_t *callback, udi_cb_t *gcb,
+ udi_channel_t channel, udi_index_t ops_idx, void *channel_context
+ )
+{
+ Warning("%s Unimplemented", __func__);
+}
+
+/**
+ */
+extern void udi_channel_spawn(
+ udi_channel_spawn_call_t *callback, udi_cb_t *gcb,
+ udi_channel_t channel, udi_index_t spawn_idx,
+ udi_index_t ops_idx, void *channel_context
+ )
+{
+ Warning("%s Unimplemented", __func__);
+}
+
+/**
+ *
+ */
+void udi_channel_set_context(
+ udi_channel_t target_channel, void *channel_context
+ )
+{
+ Warning("%s Unimplemented", __func__);
+}
+
+void udi_channel_op_abort(
+ udi_channel_t target_channel, udi_cb_t *orig_cb
+ )
+{
+ Warning("%s Unimplemented", __func__);
+}
+
+void udi_channel_close(udi_channel_t channel)
+{
+ Warning("%s Unimplemented", __func__);
+}
+
+void udi_channel_event_ind(udi_channel_event_cb_t *cb)
+{
+ udi_channel_event_complete(cb, UDI_OK);
+}
+
+void udi_channel_event_complete(udi_channel_event_cb_t *cb, udi_status_t status)
+{
+ Warning("%s Unimplemented", __func__);
+}
--- /dev/null
+/**
+ * \file logging.c
+ * \author John Hodge (thePowersGang)
+ *
+ * \brief UDI Tracing, Logging and Debug
+ */
+#include <acess.h>
+#include <udi.h>
+
+void __udi_assert(const char *expr, const char *file, int line);
+
+// === EXPORTS ===
+EXPORT(udi_trace_write);
+EXPORT(udi_log_write);
+EXPORT(__udi_assert);
+//EXPORT(udi_assert);
+EXPORT(udi_debug_break);
+EXPORT(udi_debug_printf);
+
+// === PROTOTYPES ===
+
+// === CODE ===
+void udi_trace_write(udi_init_context_t *init_context, udi_trevent_t trace_event, udi_index_t meta_idx, udi_ubit32_t msgnum, ...)
+{
+ ENTER("pinit_context itrace_event imeta_idx imsgnum",
+ init_context, trace_event, meta_idx, msgnum);
+// const char *format = UDI_GetMessage(init_context, msgnum);
+// LOG("format = \"%s\"", format);
+ LEAVE('-');
+}
+
+void udi_log_write( udi_log_write_call_t *callback, udi_cb_t *gcb,
+ udi_trevent_t trace_event, udi_ubit8_t severity, udi_index_t meta_idx,
+ udi_status_t original_status, udi_ubit32_t msgnum, ... )
+{
+ Log("UDI Log");
+}
+
+void __udi_assert(const char *expr, const char *file, int line)
+{
+ Log("UDI Assertion failure: %s:%i - %s", file, line, expr);
+ UNIMPLEMENTED();
+}
+
+void udi_assert(udi_boolean_t bool)
+{
+ UNIMPLEMENTED();
+}
+
+void udi_debug_break( udi_init_context_t *init_context, const char *message)
+{
+ UNIMPLEMENTED();
+}
+
+void udi_debug_printf( const char *format, ... )
+{
+ va_list args;
+ va_start(args, format);
+ LogF("udi_debug_printf: ");
+ LogFV(format, args);
+ va_end(args);
+}
--- /dev/null
+/**
+ * \file mem.c
+ * \author John Hodge (thePowersGang)
+ */
+#include <acess.h>
+#include <udi.h>
+
+// === EXPORTS ===
+EXPORT(udi_mem_alloc);
+EXPORT(udi_mem_free);
+
+// === 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);
+}
--- /dev/null
+/**
+ * \file meta_gio.c
+ * \author John Hodge (thePowersGang)
+ */
+#include <acess.h>
+#include <udi.h>
+
+// === EXPORTS ===
+EXPORT(udi_gio_bind_req);
+EXPORT(udi_gio_bind_ack);
+EXPORT(udi_gio_unbind_req);
+EXPORT(udi_gio_unbind_ack);
+EXPORT(udi_gio_xfer_req);
+EXPORT(udi_gio_xfer_ack);
+EXPORT(udi_gio_xfer_nak);
+EXPORT(udi_gio_event_res);
+EXPORT(udi_gio_event_ind);
+EXPORT(udi_gio_event_res_unused);
+
+// === CODE ===
+void udi_gio_bind_req(udi_gio_bind_cb_t *cb)
+{
+ UNIMPLEMENTED();
+}
+void udi_gio_bind_ack(
+ udi_gio_bind_cb_t *cb,
+ udi_ubit32_t device_size_lo,
+ udi_ubit32_t device_size_hi,
+ udi_status_t status
+ )
+{
+ UNIMPLEMENTED();
+}
+
+void udi_gio_unbind_req(udi_gio_bind_cb_t *cb)
+{
+ UNIMPLEMENTED();
+}
+void udi_gio_unbind_ack(udi_gio_bind_cb_t *cb)
+{
+ UNIMPLEMENTED();
+}
+
+void udi_gio_xfer_req(udi_gio_xfer_cb_t *cb)
+{
+ UNIMPLEMENTED();
+}
+void udi_gio_xfer_ack(udi_gio_xfer_cb_t *cb)
+{
+ UNIMPLEMENTED();
+}
+void udi_gio_xfer_nak(udi_gio_xfer_cb_t *cb, udi_status_t status)
+{
+ UNIMPLEMENTED();
+}
+
+void udi_gio_event_res(udi_gio_event_cb_t *cb)
+{
+ UNIMPLEMENTED();
+}
+void udi_gio_event_ind(udi_gio_event_cb_t *cb)
+{
+ UNIMPLEMENTED();
+}
+void udi_gio_event_res_unused(udi_gio_event_cb_t *cb)
+{
+ UNIMPLEMENTED();
+}
--- /dev/null
+/**
+ * \file meta_mgmt.c
+ * \author John Hodge (thePowersGang)
+ */
+#include <acess.h>
+#include <udi.h>
+#include "../udi_internal.h"
+
+// === EXPORTS ===
+EXPORT(udi_usage_ind);
+EXPORT(udi_static_usage);
+EXPORT(udi_usage_res);
+EXPORT(udi_enumerate_req);
+EXPORT(udi_enumerate_no_children);
+EXPORT(udi_enumerate_ack);
+EXPORT(udi_devmgmt_req);
+EXPORT(udi_devmgmt_ack);
+EXPORT(udi_final_cleanup_req);
+EXPORT(udi_final_cleanup_ack);
+
+// === CODE ===
+void udi_usage_ind(udi_usage_cb_t *cb, udi_ubit8_t resource_level)
+{
+ const udi_mgmt_ops_t *ops;
+ if( !(ops = UDI_int_ChannelPrepForCall( UDI_GCB(cb), METALANG_MGMT )) ) {
+ return ;
+ }
+
+ ops->usage_ind_op(cb, resource_level);
+}
+
+void udi_static_usage(udi_usage_cb_t *cb, udi_ubit8_t resource_level)
+{
+ UNIMPLEMENTED();
+}
+
+void udi_usage_res(udi_usage_cb_t *cb)
+{
+ UNIMPLEMENTED();
+}
+
+void udi_enumerate_req(udi_enumerate_cb_t *cb, udi_ubit8_t enumeration_level)
+{
+ UNIMPLEMENTED();
+}
+
+void udi_enumerate_no_children(udi_enumerate_cb_t *cb, udi_ubit8_t enumeration_level)
+{
+ UNIMPLEMENTED();
+}
+
+void udi_enumerate_ack(udi_enumerate_cb_t *cb, udi_ubit8_t enumeration_result, udi_index_t ops_idx)
+{
+ UNIMPLEMENTED();
+}
+
+void udi_devmgmt_req(udi_mgmt_cb_t *cb, udi_ubit8_t mgmt_op, udi_ubit8_t parent_ID )
+{
+ ENTER("pcb imgmt_op iparent_ID", cb, mgmt_op, parent_ID);
+ LEAVE('-');
+}
+
+void udi_devmgmt_ack(udi_mgmt_cb_t *cb, udi_ubit8_t flags, udi_status_t status)
+{
+ ENTER("pcb xflags istatus", cb, flags, status);
+ LEAVE('-');
+}
+
+void udi_final_cleanup_req(udi_mgmt_cb_t *cb)
+{
+ ENTER("pcb", cb);
+ LEAVE('-');
+}
+
+void udi_final_cleanup_ack(udi_mgmt_cb_t *cb)
+{
+ ENTER("pcb", cb);
+ LEAVE('-');
+}
+
--- /dev/null
+/**
+ * \file physio.c
+ * \author John Hodge (thePowersGang)
+ */
+#include <acess.h>
+#include <udi.h>
+#include <udi_physio.h>
+
+// === EXPORTS ===
+EXPORT(udi_dma_constraints_attr_set);
+EXPORT(udi_dma_constraints_attr_reset);
+EXPORT(udi_dma_constraints_free);
+
+// === CODE ===
+void udi_dma_constraints_attr_set(udi_dma_constraints_attr_set_call_t *callback, udi_cb_t *gcb,
+ udi_dma_constraints_t src_constraints,
+ const udi_dma_constraints_attr_spec_t *attr_list, udi_ubit16_t list_length,
+ udi_ubit8_t flags)
+{
+ UNIMPLEMENTED();
+}
+
+void udi_dma_constraints_attr_reset(
+ udi_dma_constraints_t constraints,
+ udi_dma_constraints_attr_t attr_type
+ )
+{
+ UNIMPLEMENTED();
+}
+
+void udi_dma_constraints_free(udi_dma_constraints_t constraints)
+{
+ UNIMPLEMENTED();
+}
--- /dev/null
+/**
+ * \file physio/dma.c
+ * \author John Hodge (thePowersGang)
+ */
+#include <acess.h>
+#include <udi.h>
+#include <udi_physio.h>
+
+// === EXPORTS ===
+EXPORT(udi_dma_prepare);
+EXPORT(udi_dma_buf_map);
+EXPORT(udi_dma_buf_unmap);
+EXPORT(udi_dma_mem_alloc);
+EXPORT(udi_dma_sync);
+EXPORT(udi_dma_scgth_sync);
+EXPORT(udi_dma_mem_barrier);
+EXPORT(udi_dma_free);
+EXPORT(udi_dma_mem_to_buf);
+
+// === CODE ===
+void udi_dma_prepare(udi_dma_prepare_call_t *callback, udi_cb_t *gcb,
+ udi_dma_constraints_t constraints, udi_ubit8_t flags)
+{
+ UNIMPLEMENTED();
+}
+
+void udi_dma_buf_map(udi_dma_buf_map_call_t *callback, udi_cb_t *gcb, udi_dma_handle_t dma_handle,
+ udi_buf_t *buf, udi_size_t offset, udi_size_t len, udi_ubit8_t flags)
+{
+ UNIMPLEMENTED();
+}
+
+udi_buf_t *udi_dma_buf_unmap(udi_dma_handle_t dma_handle, udi_size_t new_buf_size)
+{
+ UNIMPLEMENTED();
+ return NULL;
+}
+
+void udi_dma_mem_alloc(udi_dma_mem_alloc_call_t *callback, udi_cb_t *gcb,
+ udi_dma_constraints_t constraints, udi_ubit8_t flags,
+ udi_ubit16_t nelements, udi_size_t element_size, udi_size_t max_gap)
+{
+ UNIMPLEMENTED();
+}
+
+void udi_dma_sync(udi_dma_sync_call_t *callback, udi_cb_t *gcb, udi_dma_handle_t dma_handle,
+ udi_size_t offset, udi_size_t len, udi_ubit8_t flags)
+{
+ UNIMPLEMENTED();
+}
+
+void udi_dma_scgth_sync(udi_dma_scgth_sync_call_t *callback, udi_cb_t *gcb, udi_dma_handle_t dma_handle)
+{
+ UNIMPLEMENTED();
+}
+
+void udi_dma_mem_barrier(udi_dma_handle_t dma_handle)
+{
+ UNIMPLEMENTED();
+}
+
+void udi_dma_free(udi_dma_handle_t dma_handle)
+{
+ UNIMPLEMENTED();
+}
+
+void udi_dma_mem_to_buf(udi_dma_mem_to_buf_call_t *callback, udi_cb_t *gcb, udi_dma_handle_t dma_handle,
+ udi_size_t src_off, udi_size_t src_len, udi_buf_t *dst_buf)
+{
+ UNIMPLEMENTED();
+}
--- /dev/null
+/**
+ * \file physio/meta_bus.c
+ * \author John Hodge (thePowersGang)
+ */
+#include <acess.h>
+#include <udi.h>
+#include <udi_physio.h>
+
+// === EXPORTS ===
+EXPORT(udi_bus_unbind_req);
+EXPORT(udi_bus_unbind_ack);
+EXPORT(udi_bus_bind_req);
+EXPORT(udi_bus_bind_ack);
+
+// === CODE ===
+void udi_bus_unbind_req(udi_bus_bind_cb_t *cb)
+{
+ UNIMPLEMENTED();
+}
+void udi_bus_unbind_ack(udi_bus_bind_cb_t *cb)
+{
+ UNIMPLEMENTED();
+}
+
+void udi_bus_bind_req(udi_bus_bind_cb_t *cb)
+{
+ UNIMPLEMENTED();
+}
+
+void udi_bus_bind_ack(
+ udi_bus_bind_cb_t *cb,
+ udi_dma_constraints_t dma_constraints,
+ udi_ubit8_t preferred_endianness,
+ udi_status_t status
+ )
+{
+ UNIMPLEMENTED();
+}
--- /dev/null
+/**
+ * \file physio/meta_intr.c
+ * \author John Hodge (thePowersGang)
+ */
+#include <acess.h>
+#include <udi.h>
+#include <udi_physio.h>
+
+// === EXPORTS ===
+EXPORT(udi_intr_attach_req);
+EXPORT(udi_intr_attach_ack);
+//EXPORT(udi_intr_attach_ack_unused);
+EXPORT(udi_intr_detach_req);
+EXPORT(udi_intr_detach_ack);
+//EXPORT(udi_intr_detach_ack_unused);
+EXPORT(udi_intr_event_ind);
+EXPORT(udi_intr_event_rdy);
+
+// === CODE ===
+void udi_intr_attach_req(udi_intr_attach_cb_t *intr_attach_cb)
+{
+ UNIMPLEMENTED();
+}
+void udi_intr_attach_ack(udi_intr_attach_cb_t *intr_attach_cb, udi_status_t status)
+{
+ UNIMPLEMENTED();
+}
+//void udi_intr_attach_ack_unused(udi_intr_attach_cb_t *intr_attach_cb, udi_status_t status)
+//{
+// UNIMPLEMENTED();
+//}
+
+void udi_intr_detach_req(udi_intr_detach_cb_t *intr_detach_cb)
+{
+ UNIMPLEMENTED();
+}
+void udi_intr_detach_ack(udi_intr_detach_cb_t *intr_detach_cb)
+{
+ UNIMPLEMENTED();
+}
+//void udi_intr_detach_ack_unused(udi_intr_detach_cb_t *intr_detach_cb)
+//{
+// UNIMPLEMENTED();
+//}
+
+void udi_intr_event_ind(udi_intr_event_cb_t *intr_event_cb, udi_ubit8_t flags)
+{
+ UNIMPLEMENTED();
+}
+
+void udi_intr_event_rdy(udi_intr_event_cb_t *intr_event_cb)
+{
+ UNIMPLEMENTED();
+}
--- /dev/null
+/**
+ * \file physio/pio.c
+ * \author John Hodge (thePowersGang)
+ */
+#include <acess.h>
+#include <udi.h>
+#include <udi_physio.h>
+
+// === EXPORTS ===
+EXPORT(udi_pio_map);
+EXPORT(udi_pio_unmap);
+EXPORT(udi_pio_atmic_sizes);
+EXPORT(udi_pio_abort_sequence);
+EXPORT(udi_pio_trans);
+EXPORT(udi_pio_probe);
+
+// === CODE ===
+void udi_pio_map(udi_pio_map_call_t *callback, udi_cb_t *gcb,
+ udi_ubit32_t regset_idx, udi_ubit32_t base_offset, udi_ubit32_t length,
+ udi_pio_trans_t *trans_list, udi_ubit16_t list_length,
+ udi_ubit16_t pio_attributes, udi_ubit32_t pace, udi_index_t serialization_domain)
+{
+ UNIMPLEMENTED();
+}
+
+void udi_pio_unmap(udi_pio_handle_t pio_handle)
+{
+ UNIMPLEMENTED();
+}
+
+udi_ubit32_t udi_pio_atmic_sizes(udi_pio_handle_t pio_handle)
+{
+ UNIMPLEMENTED();
+ return 0;
+}
+
+void udi_pio_abort_sequence(udi_pio_handle_t pio_handle, udi_size_t scratch_requirement)
+{
+ UNIMPLEMENTED();
+}
+
+void udi_pio_trans(udi_pio_trans_call_t *callback, udi_cb_t *gcb,
+ udi_pio_handle_t pio_handle, udi_index_t start_label,
+ udi_buf_t *buf, void *mem_ptr)
+{
+ UNIMPLEMENTED();
+}
+
+void udi_pio_probe(udi_pio_probe_call_t *callback, udi_cb_t *gcb,
+ udi_pio_handle_t pio_handle, void *mem_ptr, udi_ubit32_t pio_offset,
+ udi_ubit8_t tran_size, udi_ubit8_t direction)
+{
+ UNIMPLEMENTED();
+}
+
--- /dev/null
+/**
+ * \file logging.c
+ * \author John Hodge (thePowersGang)
+ */
+#include <common.h>
+#include <udi.h>
+#include <udi_physio.h>
+
+// === CODE ===
+void udi_bus_bind_req(udi_bus_bind_cb_t *cb)
+{
+}
+
+void udi_bus_unbind_req(udi_bus_bind_cb_t *cb)
+{
+}
--- /dev/null
+/**
+ * \file queues.c
+ * \author John Hodge (thePowersGang)
+ *
+ * \brief UDI Queue Primatives
+ */
+#include <acess.h>
+#include <udi.h>
+
+// === EXPORTS ===
+EXPORT(udi_enqueue);
+EXPORT(udi_dequeue);
+
+// === CODE ===
+void udi_enqueue(udi_queue_t *new_el, udi_queue_t *old_el)
+{
+ new_el->next = old_el->next;
+ new_el->prev = old_el;
+ old_el->next = new_el;
+ old_el->next->prev = new_el;
+}
+udi_queue_t *udi_dequeue(udi_queue_t *element)
+{
+ element->next->prev = element->prev;
+ element->prev->next = element->next;
+ return element;
+}
--- /dev/null
+/*
+ */
+#include <acess.h>
+#include <udi.h>
+#include <udi_scsi.h>
+
+// === EXPORTS ===
+EXPORT(udi_scsi_bind_req);
+EXPORT(udi_scsi_bind_ack);
+EXPORT(udi_scsi_unbind_req);
+EXPORT(udi_scsi_unbind_ack);
+EXPORT(udi_scsi_io_req);
+EXPORT(udi_scsi_io_ack);
+EXPORT(udi_scsi_io_nak);
+EXPORT(udi_scsi_ctl_req);
+EXPORT(udi_scsi_ctl_ack);
+EXPORT(udi_scsi_event_ind);
+EXPORT(udi_scsi_event_ind_unused);
+EXPORT(udi_scsi_event_res);
+EXPORT(udi_scsi_inquiry_to_string);
+
+// === CODE ===
+void udi_scsi_bind_req(udi_scsi_bind_cb_t *cb,
+ udi_ubit16_t bind_flags, udi_ubit16_t queue_depth,
+ udi_ubit16_t max_sense_len, udi_ubit16_t aen_buf_size)
+{
+ UNIMPLEMENTED();
+}
+void udi_scsi_bind_ack(udi_scsi_bind_cb_t *cb, udi_ubit32_t hd_timeout_increase, udi_status_t status)
+{
+ UNIMPLEMENTED();
+}
+void udi_scsi_unbind_req(udi_scsi_bind_cb_t *cb)
+{
+ UNIMPLEMENTED();
+}
+void udi_scsi_unbind_ack(udi_scsi_bind_cb_t *cb)
+{
+ UNIMPLEMENTED();
+}
+
+void udi_scsi_io_req(udi_scsi_io_cb_t *cb)
+{
+ UNIMPLEMENTED();
+}
+void udi_scsi_io_ack(udi_scsi_io_cb_t *cb)
+{
+ UNIMPLEMENTED();
+}
+void udi_scsi_io_nak(udi_scsi_io_cb_t *cb, udi_scsi_status_t status, udi_buf_t *sense_buf)
+{
+ UNIMPLEMENTED();
+}
+void udi_scsi_ctl_req(udi_scsi_ctl_cb_t *cb)
+{
+ UNIMPLEMENTED();
+}
+void udi_scsi_ctl_ack(udi_scsi_ctl_cb_t *cb, udi_status_t status)
+{
+ UNIMPLEMENTED();
+}
+void udi_scsi_event_ind(udi_scsi_event_cb_t *cb)
+{
+ UNIMPLEMENTED();
+}
+void udi_scsi_event_ind_unused(udi_scsi_event_cb_t *cb)
+{
+ UNIMPLEMENTED();
+ udi_scsi_event_res(cb);
+}
+void udi_scsi_event_res(udi_scsi_event_cb_t *cb)
+{
+ UNIMPLEMENTED();
+}
+void udi_scsi_inquiry_to_string(const udi_ubit8_t *inquiry_data, udi_size_t inquiry_len, char *str)
+{
+ UNIMPLEMENTED();
+}
--- /dev/null
+/**
+ * \file strmem.c
+ * \author John Hodge (thePowersGang)
+ */
+#include <acess.h>
+#include <udi.h>
+
+// === EXPORTS ===
+EXPORTAS(strlen, udi_strlen);
+EXPORTAS(strcat, udi_strcat);
+EXPORTAS(strncat, udi_strncat);
+EXPORTAS(strcmp, udi_strcmp);
+EXPORTAS(strncmp, udi_strncmp);
+EXPORTAS(memcmp, udi_memcmp);
+EXPORTAS(strcpy, udi_strcpy);
+EXPORTAS(strncpy, udi_strncpy);
+EXPORTAS(memcpy, udi_memcpy);
+EXPORTAS(memmove, udi_memmove);
+EXPORT(udi_strncpy_rtrim);
+EXPORTAS(strchr, udi_strchr);
+EXPORTAS(strrchr, udi_strrchr);
+EXPORT(udi_memchr);
+EXPORTAS(memset, udi_memset);
+EXPORT(udi_strtou32);
+EXPORT(udi_snprintf);
+EXPORT(udi_vsnprintf);
+
+// === CODE ===
+char *udi_strncpy_rtrim(char *s1, const char *s2, udi_size_t n)
+{
+ char *dst = s1;
+ while( n-- )
+ {
+ *dst++ = *s2++;
+ }
+ while( dst > s1 && isspace(*--dst) )
+ ;
+ dst ++;
+ *dst = '\0';
+ return s1;
+}
+
+void *udi_memchr(const void *s, udi_ubit8_t c, udi_size_t n)
+{
+ const udi_ubit8_t *p = s;
+ while(n--)
+ {
+ if( *p == c )
+ return (void*)p;
+ p ++;
+ }
+ return NULL;
+}
+
+udi_ubit32_t udi_strtou32(const char *s, char **endptr, int base)
+{
+ return strtoul(s, endptr, base);
+}
+
+udi_size_t udi_snprintf(char *s, udi_size_t max_bytes, const char *format, ...)
+{
+ udi_size_t ret;
+ va_list args;
+ va_start(args, format);
+
+ ret = udi_vsnprintf(s, max_bytes, format, args);
+
+ va_end(args);
+ return ret;
+}
+udi_size_t udi_vsnprintf(char *s, udi_size_t max_bytes, const char *format, va_list ap)
+{
+ // TODO: This should support some stuff Acess doesn't
+ return vsnprintf(s, max_bytes, format, ap);
+}
--- /dev/null
+/**
+ * \file time.c
+ * \author John Hodge (thePowersGang)
+ */
+#include <acess.h>
+#include <udi.h>
+
+// === EXPORTS ===
+EXPORT(udi_timer_start);
+EXPORT(udi_timer_start_repeating);
+EXPORT(udi_timer_cancel);
+EXPORT(udi_time_current);
+EXPORT(udi_time_between);
+EXPORT(udi_time_since);
+
+// === CODE ===
+void udi_timer_start(udi_timer_expired_call_t *callback, udi_cb_t *gcb, udi_time_t interval)
+{
+ UNIMPLEMENTED();
+}
+void udi_timer_start_repeating(udi_timer_tick_call_t *callback, udi_cb_t *gcb, udi_time_t interval)
+{
+ UNIMPLEMENTED();
+}
+void udi_timer_cancel(udi_cb_t *gcb)
+{
+ UNIMPLEMENTED();
+}
+
+udi_timestamp_t udi_time_current(void)
+{
+ return now();
+}
+udi_time_t udi_time_between(udi_timestamp_t start_time, udi_timestamp_t end_time)
+{
+ udi_time_t ret;
+ tTime delta = end_time - start_time;
+ ret.seconds = delta / 1000;
+ ret.nanoseconds = (delta % 1000) * 1000 * 1000;
+ return ret;
+}
+udi_time_t udi_time_since(udi_timestamp_t start_time)
+{
+ return udi_time_between(start_time, udi_time_current());
+}