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");
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");
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
);
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
);
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
;
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
);
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
;
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
);
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
;
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
);
123 vec
= array_to_u8vector(buf
, ret
); // XXX: assuming that (size == len) is not is not good idea, hm
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
);
134 scm_set_smob_print(flash_iface_tag
, flash_iface_print
);
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
);