Пример #1
0
RESULT versaloon_get_target_voltage(uint16_t *voltage)
{
	uint16_t inlen;

#if PARAM_CHECK
	if (NULL == versaloon_buf) {
		LOG_BUG(ERRMSG_INVALID_BUFFER, TO_STR(versaloon_buf));
		return ERRCODE_INVALID_BUFFER;
	}
	if (NULL == voltage) {
		LOG_BUG(ERRMSG_INVALID_PARAMETER, __func__);
		return ERRCODE_INVALID_PARAMETER;
	}
#endif

	versaloon_buf[0] = VERSALOON_GET_TVCC;

	if ((ERROR_OK != versaloon_send_command(1, &inlen)) || (inlen != 2)) {
		LOG_ERROR(ERRMSG_FAILURE_OPERATION, "communicate with versaloon");
		return ERRCODE_FAILURE_OPERATION;
	} else {
		*voltage = versaloon_buf[0] + (versaloon_buf[1] << 8);
		return ERROR_OK;
	}
}
Пример #2
0
static vsf_err_t at91sam3swj_iap_poll_result(struct at91sam3swj_iap_reply_t *reply)
{
	uint32_t buff_tmp[256 + 4];
	uint32_t data_size;
	
	if (NULL == fail)
	{
		LOG_BUG(ERRMSG_INVALID_PARAMETER, __FUNCTION__);
		return VSFERR_INVALID_PARAMETER;
	}
	
	if ((reply != NULL) && (reply->data_num > (dimof(buff_tmp) - 1)))
	{
		LOG_BUG("buff size is not enough for this call.");
		return VSFERR_FAIL;
	}
	
	data_size = 4;
	if (reply != NULL)
	{
		data_size = (1 + reply->data_num) * sizeof(uint32_t);
	}
	
	// read result and sync
	// sync is 4-byte BEFORE result
	if (adi_memap_read_buf(AT91SAM3_IAP_SYNC_ADDR,
										(uint8_t *)buff_tmp, data_size))
	{
		LOG_ERROR(ERRMSG_FAILURE_OPERATION, "read iap sync");
		return ERRCODE_FAILURE_OPERATION;
	}
	// buff_tmp[0] is sync, which is eefc_frr
	if (buff_tmp[0] != 0)
	{
		if (buff_tmp[0] != 1)
		{
			cm_dump(AT91SAM3_IAP_BASE, sizeof(iap_code) + 256);
			LOG_ERROR(ERRMSG_FAILURE_OPERATION_ERRCODE, "call iap",
						buff_tmp[1]);
			return ERRCODE_FAILURE_OPERATION;
		}
		
		if ((reply != NULL) && (reply->data != NULL))
		{
			memcpy(reply->data, &buff_tmp[1],
					reply->data_num * sizeof(uint32_t));
		}
		return VSFERR_NONE;
	}
	
	return VSFERR_NOT_READY;
}
Пример #3
0
RESULT versaloon_add_pending(uint8_t type, uint8_t cmd, uint16_t actual_szie,
	uint16_t want_pos, uint16_t want_size, uint8_t *buffer, uint8_t collect)
{
#if PARAM_CHECK
	if (versaloon_pending_idx >= VERSALOON_MAX_PENDING_NUMBER) {
		LOG_BUG(ERRMSG_INVALID_INDEX, versaloon_pending_idx,
			"versaloon pending data");
		return ERROR_FAIL;
	}
#endif

	versaloon_pending[versaloon_pending_idx].type = type;
	versaloon_pending[versaloon_pending_idx].cmd = cmd;
	versaloon_pending[versaloon_pending_idx].actual_data_size = actual_szie;
	versaloon_pending[versaloon_pending_idx].want_data_pos = want_pos;
	versaloon_pending[versaloon_pending_idx].want_data_size = want_size;
	versaloon_pending[versaloon_pending_idx].data_buffer = buffer;
	versaloon_pending[versaloon_pending_idx].collect = collect;
	versaloon_pending[versaloon_pending_idx].id = versaloon_pending_id;
	versaloon_pending_id = 0;
	versaloon_pending[versaloon_pending_idx].extra_data = versaloon_extra_data;
	versaloon_extra_data = NULL;
	versaloon_pending[versaloon_pending_idx].callback = versaloon_callback;
	versaloon_callback = NULL;
	versaloon_pending[versaloon_pending_idx].pos = versaloon_want_pos;
	versaloon_want_pos = NULL;
	versaloon_pending_idx++;

	return ERROR_OK;
}
Пример #4
0
static vsf_err_t parse_operation(uint32_t *operation, const char *opt,
									uint32_t optlen)
{
	uint32_t mask = 0, tmp;
	uint32_t i;
	
#if PARAM_CHECK
	if ((NULL == operation) || (NULL == opt))
	{
		LOG_BUG(ERRMSG_INVALID_PARAMETER, __FUNCTION__);
		return VSFERR_INVALID_PARAMETER;
	}
#endif
	
	for (i = 0; i < optlen; i++)
	{
		tmp = target_area_mask(opt[i]);
		if (tmp == 0)
		{
			LOG_ERROR(ERRMSG_INVALID_CHARACTER, opt[i], "target area");
			return VSFERR_FAIL;
		}
		mask |= tmp;
	}
	
	*operation = mask;
	return VSFERR_NONE;
}
Пример #5
0
vsf_err_t usbtobdm_transact(uint8_t index, uint8_t *out,
	uint8_t outlen, uint8_t *in, uint8_t inlen, uint8_t delay, uint8_t ack)
{
	uint16_t token;
	
#if PARAM_CHECK
	if (index > 7)
	{
		LOG_BUG(ERRMSG_INVALID_INTERFACE_NUM, index);
		return VSFERR_FAIL;
	}
	if ((outlen > 0x0F) || (inlen > 0x0F) || (NULL == out) || (delay > 3))
	{
		return VSFERR_FAIL;
	}
#endif
	
	token = outlen | (inlen << 8) | (delay << 6) | (ack ? 0x8000 : 0x0000);
	SET_LE_U16(&usbtoxxx_info->cmd_buff[0], token);
	memcpy(&usbtoxxx_info->cmd_buff[2], out, outlen);
	
	if (NULL == in)
	{
		return usbtoxxx_inout_command(USB_TO_BDM, index,
				usbtoxxx_info->cmd_buff, 2 + outlen, inlen, NULL, 0, 0, 1);
	}
	else
	{
		return usbtoxxx_inout_command(USB_TO_BDM, index,
				usbtoxxx_info->cmd_buff, 2 + outlen, inlen, in, 0, inlen, 1);
	}
}
Пример #6
0
RESULT usbtojtagraw_execute(uint8_t interface_index, uint8_t *tdi,
							uint8_t *tms, uint8_t *tdo, uint32_t bitlen)
{
	uint16_t bytelen;
	
#if PARAM_CHECK
	if (interface_index > 7)
	{
		LOG_BUG(ERRMSG_INVALID_INTERFACE_NUM, interface_index);
		return ERROR_FAIL;
	}
#endif
	
	if (bitlen > 8 * 0xFFFF)
	{
		return ERROR_FAIL;
	}
	bytelen = (uint16_t)((bitlen + 7) >> 3);
	
	SET_LE_U32(&versaloon_cmd_buf[0], bitlen);
	memcpy(versaloon_cmd_buf + 4, tdi, bytelen);
	memcpy(versaloon_cmd_buf + 4 + bytelen, tms, bytelen);
	
	return usbtoxxx_inout_command(USB_TO_JTAG_RAW, interface_index,
			versaloon_cmd_buf, 4 + bytelen * 2, bytelen, tdo, 0, bytelen, 0);
}
Пример #7
0
vsf_err_t usbtoswim_enable(uint8_t index)
{
#if PARAM_CHECK
	if (index > 7)
	{
		LOG_BUG(ERRMSG_INVALID_INTERFACE_NUM, index);
		return VSFERR_FAIL;
	}
#endif
	return usbtoxxx_enable_command(USB_TO_SWIM, index, NULL, 0);
}
Пример #8
0
vsf_err_t usbtolpcicp_config(uint8_t index)
{
#if PARAM_CHECK
	if (index > 7)
	{
		LOG_BUG(ERRMSG_INVALID_INTERFACE_NUM, index);
		return VSFERR_FAIL;
	}
#endif
	
	return usbtoxxx_conf_command(USB_TO_LPCICP, index, NULL, 0);
}
Пример #9
0
vsf_err_t usbtolpcicp_out(uint8_t index, uint8_t *buff, uint16_t len)
{
#if PARAM_CHECK
	if (index > 7)
	{
		LOG_BUG(ERRMSG_INVALID_INTERFACE_NUM, index);
		return VSFERR_FAIL;
	}
#endif
	
	return usbtoxxx_out_command(USB_TO_LPCICP, index, buff, len, 0);
}
Пример #10
0
vsf_err_t usbtobdm_sync(uint8_t index, uint16_t *khz)
{
#if PARAM_CHECK
	if (index > 7)
	{
		LOG_BUG(ERRMSG_INVALID_INTERFACE_NUM, index);
		return VSFERR_FAIL;
	}
#endif
	
	return usbtoxxx_sync_command(USB_TO_BDM, index, NULL, 0, 2,
									(uint8_t *)khz);
}
Пример #11
0
RESULT versaloon_send_command(uint16_t out_len, uint16_t *inlen)
{
	int ret;

#if PARAM_CHECK
	if (NULL == versaloon_buf) {
		LOG_BUG(ERRMSG_INVALID_BUFFER, TO_STR(versaloon_buf));
		return ERRCODE_INVALID_BUFFER;
	}
	if ((0 == out_len) || (out_len > versaloon_interface.usb_setting.buf_size)) {
		LOG_BUG(ERRMSG_INVALID_PARAMETER, __func__);
		return ERRCODE_INVALID_PARAMETER;
	}
#endif

	ret = usb_bulk_write(versaloon_usb_device_handle,
			versaloon_interface.usb_setting.ep_out, (char *)versaloon_buf,
			out_len, versaloon_usb_to);
	if (ret != out_len) {
		LOG_ERROR(ERRMSG_FAILURE_OPERATION_ERRSTRING, "send usb data",
			usb_strerror());
		return ERRCODE_FAILURE_OPERATION;
	}

	if (inlen != NULL) {
		ret = usb_bulk_read(versaloon_usb_device_handle,
				versaloon_interface.usb_setting.ep_in, (char *)versaloon_buf,
				versaloon_interface.usb_setting.buf_size, versaloon_usb_to);
		if (ret > 0) {
			*inlen = (uint16_t)ret;
			return ERROR_OK;
		} else {
			LOG_ERROR(ERRMSG_FAILURE_OPERATION_ERRSTRING, "receive usb data",
				usb_strerror());
			return ERROR_FAIL;
		}
	} else
		return ERROR_OK;
}
Пример #12
0
vsf_err_t usbtolpcicp_enter_program_mode(uint8_t index)
{
#if PARAM_CHECK
	if (index > 7)
	{
		LOG_BUG(ERRMSG_INVALID_INTERFACE_NUM, index);
		return VSFERR_FAIL;
	}
#endif
	
	return usbtoxxx_inout_command(USB_TO_LPCICP, index, NULL,
									0, 0, NULL, 0, 0, 0);
}
Пример #13
0
RESULT versaloon_send_command(uint16_t out_len, uint16_t *inlen)
{
	int ret;
	int transferred;

#if PARAM_CHECK
	if (NULL == versaloon_buf) {
		LOG_BUG(ERRMSG_INVALID_BUFFER, TO_STR(versaloon_buf));
		return ERRCODE_INVALID_BUFFER;
	}
	if ((0 == out_len) || (out_len > versaloon_interface.usb_setting.buf_size)) {
		LOG_BUG(ERRMSG_INVALID_PARAMETER, __func__);
		return ERRCODE_INVALID_PARAMETER;
	}
#endif

	ret = libusb_bulk_transfer(versaloon_usb_device_handle,
			versaloon_interface.usb_setting.ep_out,
			versaloon_buf, out_len, &transferred, versaloon_usb_to);
	if (0 != ret || transferred != out_len) {
		LOG_ERROR(ERRMSG_FAILURE_OPERATION, "send usb data");
		return ERRCODE_FAILURE_OPERATION;
	}

	if (inlen != NULL) {
		ret = libusb_bulk_transfer(versaloon_usb_device_handle,
			versaloon_interface.usb_setting.ep_in,
			versaloon_buf, versaloon_interface.usb_setting.buf_size,
			&transferred, versaloon_usb_to);
		if (0 == ret) {
			*inlen = (uint16_t)transferred;
			return ERROR_OK;
		} else {
			LOG_ERROR(ERRMSG_FAILURE_OPERATION, "receive usb data");
			return ERROR_FAIL;
		}
	} else
		return ERROR_OK;
}
Пример #14
0
RESULT usbtojtagraw_config(uint8_t interface_index, uint32_t kHz)
{
	uint8_t cfg_buf[4];

#if PARAM_CHECK
	if (interface_index > 7) {
		LOG_BUG(ERRMSG_INVALID_INTERFACE_NUM, interface_index);
		return ERROR_FAIL;
	}
#endif

	SET_LE_U32(&cfg_buf[0], kHz);

	return usbtoxxx_conf_command(USB_TO_JTAG_RAW, interface_index, cfg_buf, 4);
}
Пример #15
0
vsf_err_t usbtomicrowire_transport(uint8_t index,
								uint32_t opcode, uint8_t opcode_bitlen,
								uint32_t addr, uint8_t addr_bitlen,
								uint32_t data, uint8_t data_bitlen,
								uint8_t *reply, uint8_t reply_bitlen)
{
	uint8_t reply_bytelen = (reply_bitlen + 7) / 8;
	uint16_t offset;
	
#if PARAM_CHECK
	if (index > 7)
	{
		LOG_BUG(ERRMSG_INVALID_INTERFACE_NUM, index);
		return VSFERR_FAIL;
	}
	if ((opcode_bitlen > 32) || (addr_bitlen > 32) ||
		(data_bitlen > 32) || (reply_bitlen > 32))
	{
		return VSFERR_FAIL;
	}
#endif
	
	usbtoxxx_info->cmd_buff[0] = opcode_bitlen;
	usbtoxxx_info->cmd_buff[1] = addr_bitlen;
	usbtoxxx_info->cmd_buff[2] = data_bitlen;
	usbtoxxx_info->cmd_buff[3] = reply_bitlen;
	
	offset = 4;
	if (opcode_bitlen)
	{
		SET_LE_U32(&usbtoxxx_info->cmd_buff[offset], opcode);
		offset += 4;
	}
	if (addr_bitlen)
	{
		SET_LE_U32(&usbtoxxx_info->cmd_buff[offset], addr);
		offset += 4;
	}
	if (data_bitlen)
	{
		SET_LE_U32(&usbtoxxx_info->cmd_buff[offset], data);
		offset += 4;
	}
	
	return usbtoxxx_inout_command(USB_TO_MICROWIRE, index,
		usbtoxxx_info->cmd_buff, offset, reply_bytelen, reply,
		0, reply_bytelen, 1);
}
Пример #16
0
RESULT usbtogpio_out(uint8_t interface_index, uint32_t mask, uint32_t value)
{
	uint8_t buf[4];

#if PARAM_CHECK
	if (interface_index > 7) {
		LOG_BUG(ERRMSG_INVALID_INTERFACE_NUM, interface_index);
		return ERROR_FAIL;
	}
#endif

	SET_LE_U16(&buf[0], mask);
	SET_LE_U16(&buf[2], value);

	return usbtoxxx_out_command(USB_TO_GPIO, interface_index, buf, 4, 0);
}
Пример #17
0
vsf_err_t usbtogpio_in(uint8_t index, uint32_t mask, uint32_t *value)
{
	uint8_t buf[2];
	
#if PARAM_CHECK
	if (index > 7)
	{
		LOG_BUG(ERRMSG_INVALID_INTERFACE_NUM, index);
		return VSFERR_FAIL;
	}
#endif
	
	SET_LE_U16(&buf[0], mask);
	
	return usbtoxxx_in_command(USB_TO_GPIO, index, buf, 2, 2,
							   (uint8_t*)value, 0, 2, 0);
}
Пример #18
0
vsf_err_t usbtoswim_sync(uint8_t index, uint8_t mHz)
{
	uint8_t buff[1];
	
#if PARAM_CHECK
	if (index > 7)
	{
		LOG_BUG(ERRMSG_INVALID_INTERFACE_NUM, index);
		return VSFERR_FAIL;
	}
#endif
	
	buff[0] = mHz;
	
	return usbtoxxx_sync_command(USB_TO_SWIM, index, buff, 1,
									0, NULL);
}
Пример #19
0
vsf_err_t usbtomicrowire_config(uint8_t index, uint16_t kHz,
								uint8_t sel_polarity)
{
	uint8_t conf[3];
	
#if PARAM_CHECK
	if (index > 7)
	{
		LOG_BUG(ERRMSG_INVALID_INTERFACE_NUM, index);
		return VSFERR_FAIL;
	}
#endif
	
	conf[0] = sel_polarity;
	SET_LE_U16(&conf[1], kHz);
	
	return usbtoxxx_conf_command(USB_TO_MICROWIRE, index, conf, 3);
}
Пример #20
0
vsf_err_t usbtoswim_wotf(uint8_t index, uint8_t *data, uint16_t bytelen,
						uint32_t addr)
{
#if PARAM_CHECK
	if (index > 7)
	{
		LOG_BUG(ERRMSG_INVALID_INTERFACE_NUM, index);
		return VSFERR_FAIL;
	}
#endif
	
	SET_LE_U16(&usbtoxxx_info->cmd_buff[0], bytelen);
	SET_LE_U32(&usbtoxxx_info->cmd_buff[2], addr);
	memcpy(&usbtoxxx_info->cmd_buff[6], data, bytelen);
	
	return usbtoxxx_out_command(USB_TO_SWIM, index,
								usbtoxxx_info->cmd_buff, bytelen + 6, 0);
}
Пример #21
0
vsf_err_t usbtoswim_config(uint8_t index, uint8_t mHz, uint8_t cnt0,
							uint8_t cnt1)
{
	uint8_t buff[3];
	
#if PARAM_CHECK
	if (index > 7)
	{
		LOG_BUG(ERRMSG_INVALID_INTERFACE_NUM, index);
		return VSFERR_FAIL;
	}
#endif
	
	buff[0] = mHz;
	buff[1] = cnt0;
	buff[2] = cnt1;
	
	return usbtoxxx_conf_command(USB_TO_SWIM, index, buff, 3);
}
Пример #22
0
vsf_err_t usbtoswd_config(uint8_t index, uint8_t trn, uint16_t retry,
					   uint16_t dly)
{
	uint8_t cfg_buf[5];
	
#if PARAM_CHECK
	if (index > 7)
	{
		LOG_BUG(ERRMSG_INVALID_INTERFACE_NUM, index);
		return VSFERR_FAIL;
	}
#endif
	
	cfg_buf[0] = trn;
	SET_LE_U16(&cfg_buf[1], retry);
	SET_LE_U16(&cfg_buf[3], dly);
	
	return usbtoxxx_conf_command(USB_TO_SWD, index, cfg_buf, 5);
}
Пример #23
0
vsf_err_t usbtomicrowire_poll(uint8_t index, uint16_t interval_us,
							uint16_t retry_cnt)
{
	uint8_t buff[4];
	
#if PARAM_CHECK
	if (index > 7)
	{
		LOG_BUG(ERRMSG_INVALID_INTERFACE_NUM, index);
		return VSFERR_FAIL;
	}
#endif
	
	SET_LE_U16(&buff[0], interval_us);
	SET_LE_U16(&buff[2], retry_cnt);
	
	return usbtoxxx_poll_command(USB_TO_MICROWIRE, index, buff, 4,
									NULL, 0);
}
Пример #24
0
vsf_err_t usbtogpio_config_pin(uint8_t index, uint8_t pin_idx,
								uint8_t mode)
{
	uint8_t conf[8];
	uint32_t mask = 0, dir_mask = 0, pull_en_mask = 0, out_mask = 0;
	
#if PARAM_CHECK
	if (index > 7)
	{
		LOG_BUG(ERRMSG_INVALID_INTERFACE_NUM, index);
		return VSFERR_FAIL;
	}
	if (pin_idx >= 32)
	{
		return VSFERR_FAIL;
	}
#endif
	
	mask = 1 << pin_idx;
	if ((mode & USB_TO_GPIO_DIR_MSK) == USB_TO_GPIO_OUT)
	{
		dir_mask = mask;
	}
	if ((mode & USB_TO_GPIO_PULLEN_MSK) == USB_TO_GPIO_PULLEN)
	{
		pull_en_mask = mask;
	}
	if ((mode & USB_TO_GPIO_OUT_MSK) == USB_TO_GPIO_OUT1)
	{
		out_mask = mask;
	}
	
	dir_mask &= mask;
	SET_LE_U16(&conf[0], mask);
	SET_LE_U16(&conf[2], dir_mask);
	SET_LE_U16(&conf[4], pull_en_mask);
	SET_LE_U16(&conf[6], out_mask);
	
	return usbtoxxx_conf_command(USB_TO_GPIO, index, conf,
									sizeof(conf));
}
Пример #25
0
vsf_err_t usbtolpcicp_poll_ready(uint8_t index, uint8_t data,
			uint8_t *ret, uint8_t setmask, uint8_t clearmask, uint16_t pollcnt)
{
	uint8_t cmdbuf[5];
	
#if PARAM_CHECK
	if (index > 7)
	{
		LOG_BUG(ERRMSG_INVALID_INTERFACE_NUM, index);
		return VSFERR_FAIL;
	}
#endif
	
	cmdbuf[0] = data;
	cmdbuf[1] = setmask;
	cmdbuf[2] = clearmask;
	SET_LE_U16(&cmdbuf[3], pollcnt);
	
	return usbtoxxx_poll_command(USB_TO_LPCICP, index, cmdbuf, 5,
								 ret, 1);
}
Пример #26
0
RESULT usbtogpio_config(uint8_t interface_index, uint32_t mask,
	uint32_t dir_mask, uint32_t pull_en_mask,
	uint32_t input_pull_mask)
{
	uint8_t conf[8];

#if PARAM_CHECK
	if (interface_index > 7) {
		LOG_BUG(ERRMSG_INVALID_INTERFACE_NUM, interface_index);
		return ERROR_FAIL;
	}
#endif

	dir_mask &= mask;
	SET_LE_U16(&conf[0], mask);
	SET_LE_U16(&conf[2], dir_mask);
	SET_LE_U16(&conf[4], pull_en_mask);
	SET_LE_U16(&conf[6], input_pull_mask);

	return usbtoxxx_conf_command(USB_TO_GPIO, interface_index, conf,
		sizeof(conf));
}
Пример #27
0
size_t HIR::TypeRef::get_size(size_t ofs) const
{
    if( const auto* w = this->get_wrapper(ofs) )
    {
        switch(w->type)
        {
        case TypeWrapper::Ty::Array:
            return this->get_size(1) * w->size;
        case TypeWrapper::Ty::Borrow:
        case TypeWrapper::Ty::Pointer:
            if( const auto* next_w = this->get_wrapper(ofs+1) )
            {
                if( next_w->type == TypeWrapper::Ty::Slice )
                {
                    return POINTER_SIZE*2;
                }
                else
                {
                    return POINTER_SIZE;
                }
            }
            else
            {
                // Need to look up the metadata type for the actual type
                if( this->inner_type == RawType::Composite )
                {
                    if( this->composite_type->dst_meta == RawType::Unreachable )
                    {
                        return POINTER_SIZE;
                    }
                    // Special case: extern types (which appear when a type is only ever used by pointer)
                    if( this->composite_type->dst_meta == RawType::Unit )
                    {
                        return POINTER_SIZE;
                    }

                    // TODO: Ideally, this inner type wouldn't be unsized itself... but checking that would be interesting.
                    return POINTER_SIZE + this->composite_type->dst_meta.get_size();
                }
                else if( this->inner_type == RawType::Str )
                    return POINTER_SIZE*2;
                else if( this->inner_type == RawType::TraitObject )
                    return POINTER_SIZE*2;
                else
                {
                    return POINTER_SIZE;
                }
            }
        case TypeWrapper::Ty::Slice:
            LOG_BUG("Getting size of a slice - " << *this);
        }
        throw "";
    }
    else
    {
        switch(this->inner_type)
        {
        case RawType::Unit:
            return 0;
        case RawType::Composite:
            // NOTE: Don't care if the type has metadata
            return this->composite_type->size;
        case RawType::Unreachable:
            LOG_BUG("Attempting to get size of an unreachable type, " << *this);
        case RawType::TraitObject:
        case RawType::Str:
            LOG_BUG("Attempting to get size of an unsized type, " << *this);
        case RawType::U8:   case RawType::I8:
            return 1;
        case RawType::U16:  case RawType::I16:
            return 2;
        case RawType::U32:  case RawType::I32:
            return 4;
        case RawType::U64:  case RawType::I64:
            return 8;
        case RawType::U128: case RawType::I128:
            return 16;

        case RawType::Bool:
            return 1;
        case RawType::Char:
            return 4;

        case RawType::F32:
            return 4;
        case RawType::F64:
            return 8;

        case RawType::Function: // This should probably be invalid?
        case RawType::USize: case RawType::ISize:
            return POINTER_SIZE;
        }
        throw "";
    }
}