I/O debugging, send-loader implementer. no error-checking, though. will add later.
[mot-flash.git] / iface_type.c
blobcfb59b723c1f56e49f0a1b26edc8c1f144f5a7b9
1 #include <libguile.h>
2 #include <stdio.h>
3 #include <memory.h>
5 #include "iface_type.h"
7 scm_t_bits flash_iface_tag;
9 static SCM flash_iface_mark(SCM flash_iface_smob)
11 // struct flash_iface *iface = (struct flash_iface*)SCM_SMOB_DATA(flash_iface_snob);
12 struct flash_iface *iface = EXTRACT_IFACE(flash_iface_smob);
14 fprintf(stderr, "iface marked\n");
16 * stub
19 return SCM_BOOL_F;
22 static size_t flash_iface_free(SCM flash_iface_smob)
24 struct flash_iface *iface = EXTRACT_IFACE(flash_iface_smob);
26 scm_gc_free(iface, sizeof(struct flash_iface), "flash-iface");
28 return 0;
31 static int flash_iface_print(SCM flash_iface_smob, SCM port, scm_print_state *pstate)
33 struct flash_iface *iface = EXTRACT_IFACE(flash_iface_smob);
35 return 1;
38 static SCM close_flash_iface(SCM flash_iface_smob)
40 struct flash_iface *iface;
42 scm_assert_smob_type(flash_iface_tag, flash_iface_smob);
44 iface = EXTRACT_IFACE(flash_iface_smob);
45 if (iface->iface_close != NULL)
46 iface->iface_close(iface->handle);
48 iface->handle = NULL;
49 return SCM_BOOL_T;
52 static scm_t_uint8 *u8vector_to_array(SCM vec, size_t *len)
54 const scm_t_uint8 *raw_vec;
55 scm_t_uint8 *raw_copy;
56 size_t i;
57 ssize_t inc;
58 scm_t_array_handle vec_handle;
60 raw_vec = scm_u8vector_elements(vec, &vec_handle, len, &inc);
61 raw_copy = scm_malloc(sizeof(*raw_vec)*(*len));
63 for (i = 0; i < *len; ++i, raw_vec += inc)
65 raw_copy[i] = *raw_vec;
67 scm_array_handle_release(&vec_handle);
68 return raw_copy;
71 static SCM array_to_u8vector(scm_t_uint8 *arr, size_t len) // copies arr
73 scm_t_uint8 *new_block;
74 size_t block_size = sizeof(*new_block)*len;
76 new_block = scm_malloc(block_size);
77 memcpy(new_block, arr, block_size);
79 return scm_take_u8vector(new_block, len);
82 static SCM write_flash_iface(SCM flash_iface_smob, SCM vdata)
84 struct flash_iface *iface;
85 size_t data_len;
86 int ret;
87 scm_t_uint8 *raw_data;
89 scm_assert_smob_type(flash_iface_tag, flash_iface_smob);
90 SCM_ASSERT(scm_is_true(scm_u8vector_p(vdata)), vdata, SCM_ARG2, "write-flash-iface");
92 iface = EXTRACT_IFACE(flash_iface_smob);
94 raw_data = u8vector_to_array(vdata, &data_len);
95 ret = iface->iface_write(iface->handle, (uint8_t*)raw_data, (int)data_len);
96 free(raw_data);
98 if (ret < 0)
99 return SCM_BOOL_F;
100 else
101 return scm_from_int(ret);
104 static SCM read_flash_iface(SCM flash_iface_smob)
106 #define BUFSIZE 8192 // assume that it is enough, will rewrite later
107 struct flash_iface *iface;
108 int ret;
109 SCM vec;
110 scm_t_uint8 *buf;
112 scm_assert_smob_type(flash_iface_tag, flash_iface_smob);
114 iface = EXTRACT_IFACE(flash_iface_smob);
116 buf = scm_malloc(sizeof(*buf)*BUFSIZE);
117 ret = iface->iface_read(iface->handle, buf, (int)BUFSIZE);
119 if (ret <= 0) {
120 free(buf);
121 return SCM_BOOL_F;
123 vec = array_to_u8vector(buf, ret); // XXX: assuming that (size == len) is not is not good idea, hm
124 free(buf);
125 return vec;
128 void init_flash_iface_type(void)
130 flash_iface_tag = scm_make_smob_type("flash-iface", sizeof(struct flash_iface));
131 scm_set_smob_mark(flash_iface_tag, flash_iface_mark);
132 scm_set_smob_free(flash_iface_tag, flash_iface_free);
133 #if 0
134 scm_set_smob_print(flash_iface_tag, flash_iface_print);
135 #endif
136 scm_c_define_gsubr("close-flash-iface", 1, 0, 0, &close_flash_iface);
137 scm_c_define_gsubr("write-flash-iface", 2, 0, 0, &write_flash_iface);
138 scm_c_define_gsubr("read-flash-iface", 1, 0, 0, &read_flash_iface);