static void dw_dma_isr(void *arg) { struct device *dev = (struct device *)arg; const struct dw_dma_dev_cfg *const dev_cfg = DEV_CFG(dev); struct dw_dma_dev_data *const dev_data = DEV_DATA(dev); struct dma_chan_data *chan_data; u32_t status_tfr = 0; u32_t status_block = 0; u32_t status_err = 0; u32_t status_intr; u32_t channel; status_intr = dw_read(dev_cfg->base, DW_INTR_STATUS); if (!status_intr) { SYS_LOG_ERR("status_intr = %d", status_intr); } /* get the source of our IRQ. */ status_block = dw_read(dev_cfg->base, DW_STATUS_BLOCK); status_tfr = dw_read(dev_cfg->base, DW_STATUS_TFR); /* TODO: handle errors, just clear them atm */ status_err = dw_read(dev_cfg->base, DW_STATUS_ERR); if (status_err) { SYS_LOG_ERR("status_err = %d\n", status_err); dw_write(dev_cfg->base, DW_CLEAR_ERR, status_err); } /* clear interrupts */ dw_write(dev_cfg->base, DW_CLEAR_BLOCK, status_block); dw_write(dev_cfg->base, DW_CLEAR_TFR, status_tfr); /* Dispatch ISRs for channels depending upon the bit set */ while (status_block) { channel = find_lsb_set(status_block) - 1; status_block &= ~(1 << channel); chan_data = &dev_data->chan[channel]; if (chan_data->dma_blkcallback) { /* Ensure the linked list (chan_data->lli) is * freed in the user callback function once * all the blocks are transferred. */ chan_data->dma_blkcallback(dev, channel, 0); } } while (status_tfr) { channel = find_lsb_set(status_tfr) - 1; status_tfr &= ~(1 << channel); chan_data = &dev_data->chan[channel]; k_free(chan_data->lli); chan_data->lli = NULL; if (chan_data->dma_tfrcallback) { chan_data->dma_tfrcallback(dev, channel, 0); } } }
static int fxos8700_sample_fetch(struct device *dev, enum sensor_channel chan) { const struct fxos8700_config *config = dev->config->config_info; struct fxos8700_data *data = dev->driver_data; u8_t buffer[FXOS8700_MAX_NUM_BYTES]; u8_t num_bytes; s16_t *raw; int ret = 0; int i; if (chan != SENSOR_CHAN_ALL) { SYS_LOG_ERR("Unsupported sensor channel"); return -ENOTSUP; } k_sem_take(&data->sem, K_FOREVER); /* Read all the channels in one I2C transaction. The number of bytes to * read and the starting register address depend on the mode * configuration (accel-only, mag-only, or hybrid). */ num_bytes = config->num_channels * FXOS8700_BYTES_PER_CHANNEL_NORMAL; __ASSERT(num_bytes <= sizeof(buffer), "Too many bytes to read"); if (i2c_burst_read(data->i2c, config->i2c_address, config->start_addr, buffer, num_bytes)) { SYS_LOG_ERR("Could not fetch sample"); ret = -EIO; goto exit; } /* Parse the buffer into raw channel data (16-bit integers). To save * RAM, store the data in raw format and wait to convert to the * normalized sensor_value type until later. */ __ASSERT(config->start_channel + config->num_channels <= ARRAY_SIZE(data->raw), "Too many channels"); raw = &data->raw[config->start_channel]; for (i = 0; i < num_bytes; i += 2) { *raw++ = (buffer[i] << 8) | (buffer[i+1]); } #ifdef CONFIG_FXOS8700_TEMP if (i2c_reg_read_byte(data->i2c, config->i2c_address, FXOS8700_REG_TEMP, &data->temp)) { SYS_LOG_ERR("Could not fetch temperature"); ret = -EIO; goto exit; } #endif exit: k_sem_give(&data->sem); return ret; }
int validate_hw_compatibility(struct device *dev) { u32_t flags = 0; flags = cipher_query_hwcaps(dev); if ((flags & CAP_RAW_KEY) == 0) { SYS_LOG_INF(" Please provision the key separately " "as the module doesnt support a raw key"); return -1; } if ((flags & CAP_SYNC_OPS) == 0) { SYS_LOG_ERR("The app assumes sync semantics. " "Please rewrite the app accordingly before proceeding"); return -1; } if ((flags & CAP_SEPARATE_IO_BUFS) == 0) { SYS_LOG_ERR("The app assumes distinct IO buffers. " "Please rewrite the app accordingly before proceeding"); return -1; } cap_flags = CAP_RAW_KEY | CAP_SYNC_OPS | CAP_SEPARATE_IO_BUFS; return 0; }
static int ak8975_sample_fetch(struct device *dev, enum sensor_channel chan) { struct ak8975_data *drv_data = dev->driver_data; u8_t buf[6]; __ASSERT_NO_MSG(chan == SENSOR_CHAN_ALL); if (i2c_reg_write_byte(drv_data->i2c, CONFIG_AK8975_I2C_ADDR, AK8975_REG_CNTL, AK8975_MODE_MEASURE) < 0) { SYS_LOG_ERR("Failed to start measurement."); return -EIO; } k_busy_wait(AK8975_MEASURE_TIME_US); if (i2c_burst_read(drv_data->i2c, CONFIG_AK8975_I2C_ADDR, AK8975_REG_DATA_START, buf, 6) < 0) { SYS_LOG_ERR("Failed to read sample data."); return -EIO; } drv_data->x_sample = sys_le16_to_cpu(buf[0] | (buf[1] << 8)); drv_data->y_sample = sys_le16_to_cpu(buf[2] | (buf[3] << 8)); drv_data->z_sample = sys_le16_to_cpu(buf[4] | (buf[5] << 8)); return 0; }
static int do_deregister_reply_cb(const struct zoap_packet *response, struct zoap_reply *reply, const struct sockaddr *from) { u8_t code; int index; code = zoap_header_get_code(response); SYS_LOG_DBG("Deregister callback (code:%u.%u)", ZOAP_RESPONSE_CODE_CLASS(code), ZOAP_RESPONSE_CODE_DETAIL(code)); index = find_clients_index(from, false); if (index < 0) { SYS_LOG_ERR("Registration clients index not found."); return 0; } if (code == ZOAP_RESPONSE_CODE_DELETED) { clients[index].registered = 0; SYS_LOG_DBG("Deregistration success"); set_sm_state(index, ENGINE_DEREGISTERED); } else { SYS_LOG_ERR("failed with code %u.%u", ZOAP_RESPONSE_CODE_CLASS(code), ZOAP_RESPONSE_CODE_DETAIL(code)); if (get_sm_state(index) == ENGINE_DEREGISTER_SENT) { set_sm_state(index, ENGINE_DEREGISTER_FAILED); } } return 0; }
static int wpanusb_init(struct device *dev) { struct wpanusb_dev_data_t * const dev_data = DEV_DATA(dev); int ret; SYS_LOG_DBG(""); wpanusb_config.interface.payload_data = dev_data->interface_data; wpanusb_dev = dev; /* Initialize the USB driver with the right configuration */ ret = usb_set_config(&wpanusb_config); if (ret < 0) { SYS_LOG_ERR("Failed to configure USB"); return ret; } /* Enable USB driver */ ret = usb_enable(&wpanusb_config); if (ret < 0) { SYS_LOG_ERR("Failed to enable USB"); return ret; } return 0; }
int amg88xx_init(struct device *dev) { struct amg88xx_data *drv_data = dev->driver_data; drv_data->i2c = device_get_binding(CONFIG_AMG88XX_I2C_MASTER_DEV_NAME); if (drv_data->i2c == NULL) { SYS_LOG_ERR("Failed to get pointer to %s device!", CONFIG_AMG88XX_I2C_MASTER_DEV_NAME); return -EINVAL; } if (amg88xx_init_device(dev) < 0) { SYS_LOG_ERR("Failed to initialize device!"); return -EIO; } #ifdef CONFIG_AMG88XX_TRIGGER if (amg88xx_init_interrupt(dev) < 0) { SYS_LOG_ERR("Failed to initialize interrupt!"); return -EIO; } #endif return 0; }
static u8_t *recv_cb(u8_t *buf, size_t *off) { struct btp_hdr *cmd = (void *) buf; u8_t *new_buf; u16_t len; if (*off < sizeof(*cmd)) { return buf; } len = sys_le16_to_cpu(cmd->len); if (len > BTP_MTU - sizeof(*cmd)) { SYS_LOG_ERR("BT tester: invalid packet length"); *off = 0; return buf; } if (*off < sizeof(*cmd) + len) { return buf; } new_buf = k_fifo_get(&avail_queue, K_NO_WAIT); if (!new_buf) { SYS_LOG_ERR("BT tester: RX overflow"); *off = 0; return buf; } k_fifo_put(&cmds_queue, buf); *off = 0; return new_buf; }
static int lwm2m_setup(void) { struct float32_value float_value; /* setup SECURITY object */ /* setup SERVER object */ /* setup DEVICE object */ lwm2m_engine_set_string("3/0/0", CLIENT_MANUFACTURER); lwm2m_engine_set_string("3/0/1", CLIENT_MODEL_NUMBER); lwm2m_engine_set_string("3/0/2", CLIENT_SERIAL_NUMBER); lwm2m_engine_set_string("3/0/3", CLIENT_FIRMWARE_VER); lwm2m_engine_register_exec_callback("3/0/4", device_reboot_cb); lwm2m_engine_register_exec_callback("3/0/5", device_factory_default_cb); lwm2m_engine_set_u8("3/0/9", 95); /* battery level */ lwm2m_engine_set_u32("3/0/10", 15); /* mem free */ lwm2m_engine_set_string("3/0/17", CLIENT_DEVICE_TYPE); lwm2m_engine_set_string("3/0/18", CLIENT_HW_VER); lwm2m_engine_set_u8("3/0/20", LWM2M_DEVICE_BATTERY_STATUS_CHARGING); lwm2m_engine_set_u32("3/0/21", 25); /* mem total */ pwrsrc_bat = lwm2m_device_add_pwrsrc(LWM2M_DEVICE_PWR_SRC_TYPE_BAT_INT); if (pwrsrc_bat < 0) { SYS_LOG_ERR("LWM2M battery power source enable error (err:%d)", pwrsrc_bat); return pwrsrc_bat; } lwm2m_device_set_pwrsrc_voltage_mv(pwrsrc_bat, battery_voltage); lwm2m_device_set_pwrsrc_current_ma(pwrsrc_bat, battery_current); pwrsrc_usb = lwm2m_device_add_pwrsrc(LWM2M_DEVICE_PWR_SRC_TYPE_USB); if (pwrsrc_usb < 0) { SYS_LOG_ERR("LWM2M usb power source enable error (err:%d)", pwrsrc_usb); return pwrsrc_usb; } lwm2m_device_set_pwrsrc_voltage_mv(pwrsrc_usb, usb_voltage); lwm2m_device_set_pwrsrc_current_ma(pwrsrc_usb, usb_current); /* setup FIRMWARE object */ lwm2m_engine_register_post_write_callback("5/0/0", firmware_block_received_cb); lwm2m_firmware_set_write_cb(firmware_block_received_cb); lwm2m_engine_register_exec_callback("5/0/2", firmware_update_cb); /* setup TEMP SENSOR object */ lwm2m_engine_create_obj_inst("3303/0"); /* dummy temp data in C*/ float_value.val1 = 25; float_value.val2 = 0; lwm2m_engine_set_float32("3303/0/5700", &float_value); return 0; }
static int loopback_send(struct net_if *iface, struct net_pkt *pkt) { struct net_pkt *cloned; int res; if (!pkt->frags) { SYS_LOG_ERR("No data to send"); return -ENODATA; } /* We need to swap the IP addresses because otherwise * the packet will be dropped. */ if (net_pkt_family(pkt) == AF_INET6) { struct in6_addr addr; net_ipaddr_copy(&addr, &NET_IPV6_HDR(pkt)->src); net_ipaddr_copy(&NET_IPV6_HDR(pkt)->src, &NET_IPV6_HDR(pkt)->dst); net_ipaddr_copy(&NET_IPV6_HDR(pkt)->dst, &addr); } else { struct in_addr addr; net_ipaddr_copy(&addr, &NET_IPV4_HDR(pkt)->src); net_ipaddr_copy(&NET_IPV4_HDR(pkt)->src, &NET_IPV4_HDR(pkt)->dst); net_ipaddr_copy(&NET_IPV4_HDR(pkt)->dst, &addr); } /* We should simulate normal driver meaning that if the packet is * properly sent (which is always in this driver), then the packet * must be dropped. This is very much needed for TCP packets where * the packet is reference counted in various stages of sending. */ cloned = net_pkt_clone(pkt, K_MSEC(100)); if (!cloned) { res = -ENOMEM; goto out; } res = net_recv_data(iface, cloned); if (res < 0) { SYS_LOG_ERR("Data receive failed."); goto out; } net_pkt_unref(pkt); out: /* Let the receiving thread run now */ k_yield(); return res; }
static int sm_do_deregister(int index) { struct zoap_packet request; struct net_pkt *pkt = NULL; struct zoap_pending *pending = NULL; struct zoap_reply *reply = NULL; int ret; ret = lwm2m_init_message(clients[index].net_ctx, &request, &pkt, ZOAP_TYPE_CON, ZOAP_METHOD_DELETE, 0, NULL, 0); if (ret) { goto cleanup; } zoap_add_option(&request, ZOAP_OPTION_URI_PATH, clients[index].server_ep, strlen(clients[index].server_ep)); pending = lwm2m_init_message_pending(&request, &clients[index].reg_server, pendings, NUM_PENDINGS); if (!pending) { ret = -ENOMEM; goto cleanup; } reply = zoap_reply_next_unused(replies, NUM_REPLIES); if (!reply) { SYS_LOG_ERR("No resources for waiting for replies."); ret = -ENOMEM; goto cleanup; } zoap_reply_init(reply, &request); reply->reply = do_deregister_reply_cb; SYS_LOG_INF("Deregister from '%s'", clients[index].server_ep); ret = lwm2m_udp_sendto(pkt, &clients[index].reg_server); if (ret < 0) { SYS_LOG_ERR("Error sending LWM2M packet (err:%d).", ret); goto cleanup; } zoap_pending_cycle(pending); k_delayed_work_submit(&retransmit_work, pending->timeout); set_sm_state(index, ENGINE_DEREGISTER_SENT); return ret; cleanup: lwm2m_init_message_cleanup(pkt, pending, reply); return ret; }
int lsm6dsl_init_interrupt(struct device *dev) { struct lsm6dsl_data *drv_data = dev->driver_data; /* setup data ready gpio interrupt */ drv_data->gpio = device_get_binding(CONFIG_LSM6DSL_GPIO_DEV_NAME); if (drv_data->gpio == NULL) { SYS_LOG_ERR("Cannot get pointer to %s device.", CONFIG_LSM6DSL_GPIO_DEV_NAME); return -EINVAL; } gpio_pin_configure(drv_data->gpio, CONFIG_LSM6DSL_GPIO_PIN_NUM, GPIO_DIR_IN | GPIO_INT | GPIO_INT_EDGE | GPIO_INT_ACTIVE_HIGH | GPIO_INT_DEBOUNCE); gpio_init_callback(&drv_data->gpio_cb, lsm6dsl_gpio_callback, BIT(CONFIG_LSM6DSL_GPIO_PIN_NUM)); if (gpio_add_callback(drv_data->gpio, &drv_data->gpio_cb) < 0) { SYS_LOG_ERR("Could not set gpio callback."); return -EIO; } /* enable data-ready interrupt */ if (drv_data->hw_tf->update_reg(drv_data, LSM6DSL_REG_INT1_CTRL, LSM6DSL_SHIFT_INT1_CTRL_DRDY_XL | LSM6DSL_SHIFT_INT1_CTRL_DRDY_G, (1 << LSM6DSL_SHIFT_INT1_CTRL_DRDY_XL) | (1 << LSM6DSL_SHIFT_INT1_CTRL_DRDY_G)) < 0) { SYS_LOG_ERR("Could not enable data-ready interrupt."); return -EIO; } #if defined(CONFIG_LSM6DSL_TRIGGER_OWN_THREAD) k_sem_init(&drv_data->gpio_sem, 0, UINT_MAX); k_thread_create(&drv_data->thread, drv_data->thread_stack, CONFIG_LSM6DSL_THREAD_STACK_SIZE, (k_thread_entry_t)lsm6dsl_thread, dev, 0, NULL, K_PRIO_COOP(CONFIG_LSM6DSL_THREAD_PRIORITY), 0, 0); #elif defined(CONFIG_LSM6DSL_TRIGGER_GLOBAL_THREAD) drv_data->work.handler = lsm6dsl_work_cb; drv_data->dev = dev; #endif gpio_pin_enable_callback(drv_data->gpio, CONFIG_LSM6DSL_GPIO_PIN_NUM); return 0; }
static void eth_rx(struct device *port) { struct eth_runtime *context = port->driver_data; uint32_t base_addr = context->base_addr; struct net_buf *buf; uint32_t frm_len = 0; /* Check whether the RX descriptor is still owned by the device. If not, * process the received frame or an error that may have occurred. */ if (context->rx_desc.own == 1) { SYS_LOG_ERR("Spurious receive interrupt from Ethernet MAC.\n"); return; } if (!net_driver_ethernet_is_opened()) { goto release_desc; } if (context->rx_desc.err_summary) { SYS_LOG_ERR("Error receiving frame: RDES0 = %08x, RDES1 = %08x.\n", context->rx_desc.rdes0, context->rx_desc.rdes1); goto release_desc; } frm_len = context->rx_desc.frm_len; if (frm_len > UIP_BUFSIZE) { SYS_LOG_ERR("Frame too large: %u.\n", frm_len); goto release_desc; } buf = ip_buf_get_reserve_rx(0); if (buf == NULL) { SYS_LOG_ERR("Failed to obtain RX buffer.\n"); goto release_desc; } memcpy(net_buf_add(buf, frm_len), (void *)context->rx_buf, frm_len); uip_len(buf) = frm_len; net_driver_ethernet_recv(buf); release_desc: /* Return ownership of the RX descriptor to the device. */ context->rx_desc.own = 1; /* Request that the device check for an available RX descriptor, since * ownership of the descriptor was just transferred to the device. */ eth_write(base_addr, REG_ADDR_RX_POLL_DEMAND, 1); }
int ak8975_init(struct device *dev) { struct ak8975_data *drv_data = dev->driver_data; u8_t id; drv_data->i2c = device_get_binding(CONFIG_AK8975_I2C_MASTER_DEV_NAME); if (drv_data->i2c == NULL) { SYS_LOG_ERR("Failed to get pointer to %s device!", CONFIG_AK8975_I2C_MASTER_DEV_NAME); return -EINVAL; } #ifdef CONFIG_MPU9150 /* wake up MPU9150 chip */ if (i2c_reg_update_byte(drv_data->i2c, MPU9150_I2C_ADDR, MPU9150_REG_PWR_MGMT1, MPU9150_SLEEP_EN, 0) < 0) { SYS_LOG_ERR("Failed to wake up MPU9150 chip."); return -EIO; } /* enable MPU9150 pass-though to have access to AK8975 */ if (i2c_reg_update_byte(drv_data->i2c, MPU9150_I2C_ADDR, MPU9150_REG_BYPASS_CFG, MPU9150_I2C_BYPASS_EN, MPU9150_I2C_BYPASS_EN) < 0) { SYS_LOG_ERR("Failed to enable pass-through mode for MPU9150."); return -EIO; } #endif /* check chip ID */ if (i2c_reg_read_byte(drv_data->i2c, CONFIG_AK8975_I2C_ADDR, AK8975_REG_CHIP_ID, &id) < 0) { SYS_LOG_ERR("Failed to read chip ID."); return -EIO; } if (id != AK8975_CHIP_ID) { SYS_LOG_ERR("Invalid chip ID."); return -EINVAL; } if (ak8975_read_adjustment_data(drv_data) < 0) { return -EIO; } dev->driver_api = &ak8975_driver_api; return 0; }
int mpu6050_init_interrupt(struct device *dev) { struct mpu6050_data *drv_data = dev->driver_data; /* setup data ready gpio interrupt */ drv_data->gpio = device_get_binding(CONFIG_MPU6050_GPIO_DEV_NAME); if (drv_data->gpio == NULL) { SYS_LOG_ERR("Failed to get pointer to %s device", CONFIG_MPU6050_GPIO_DEV_NAME); return -EINVAL; } gpio_pin_configure(drv_data->gpio, CONFIG_MPU6050_GPIO_PIN_NUM, GPIO_DIR_IN | GPIO_INT | GPIO_INT_EDGE | GPIO_INT_ACTIVE_HIGH | GPIO_INT_DEBOUNCE); gpio_init_callback(&drv_data->gpio_cb, mpu6050_gpio_callback, BIT(CONFIG_MPU6050_GPIO_PIN_NUM)); if (gpio_add_callback(drv_data->gpio, &drv_data->gpio_cb) < 0) { SYS_LOG_ERR("Failed to set gpio callback"); return -EIO; } /* enable data ready interrupt */ if (i2c_reg_write_byte(drv_data->i2c, CONFIG_MPU6050_I2C_ADDR, MPU6050_REG_INT_EN, MPU6050_DRDY_EN) < 0) { SYS_LOG_ERR("Failed to enable data ready interrupt."); return -EIO; } #if defined(CONFIG_MPU6050_TRIGGER_OWN_THREAD) k_sem_init(&drv_data->gpio_sem, 0, UINT_MAX); k_thread_create(&drv_data->thread, drv_data->thread_stack, CONFIG_MPU6050_THREAD_STACK_SIZE, (k_thread_entry_t)mpu6050_thread, dev, 0, NULL, K_PRIO_COOP(CONFIG_MPU6050_THREAD_PRIORITY), 0, 0); #elif defined(CONFIG_MPU6050_TRIGGER_GLOBAL_THREAD) drv_data->work.handler = mpu6050_work_cb; drv_data->dev = dev; #endif gpio_pin_enable_callback(drv_data->gpio, CONFIG_MPU6050_GPIO_PIN_NUM); return 0; }
static int do_ccm_encrypt_mac(struct cipher_ctx *ctx, struct cipher_aead_pkt *aead_op, u8_t *nonce) { struct device *dev = ctx->device; struct ataes132a_driver_state *state = ctx->drv_sessn_state; struct ataes132a_mac_mode mac_mode; u8_t key_id; key_id = state->key_id; assert(*(u8_t *)ctx->key.handle == key_id); /* Removing all this salt from the MAC reduces the protection * but allows any other crypto implementations to authorize * the message. */ mac_mode.include_counter = false; mac_mode.include_serial = false; mac_mode.include_smallzone = false; if (aead_op->pkt->in_len <= 16 && aead_op->pkt->out_buf_max < 16) { SYS_LOG_ERR("Not enough space available in out buffer."); return -EINVAL; } if (aead_op->pkt->in_len > 16 && aead_op->pkt->out_buf_max < 32) { SYS_LOG_ERR("Not enough space available in out buffer."); return -EINVAL; } if (aead_op->pkt->in_len <= 16) { aead_op->pkt->out_len = 16; } else if (aead_op->pkt->in_len > 16) { aead_op->pkt->out_len = 32; } if (aead_op->ad != NULL || aead_op->ad_len != 0) { SYS_LOG_ERR("Associated data is not supported."); return -EINVAL; } ataes132a_aes_ccm_encrypt(dev, key_id, &mac_mode, aead_op, nonce, NULL); return 0; }
static int dma_stm32_disable_stream(struct dma_stm32_device *ddata, u32_t id) { u32_t config; int count = 0; int ret = 0; for (;;) { config = dma_stm32_read(ddata, DMA_STM32_SCR(id)); /* Stream already disabled */ if (!(config & DMA_STM32_SCR_EN)) { return 0; } /* Try to disable stream */ dma_stm32_write(ddata, DMA_STM32_SCR(id), config &= ~DMA_STM32_SCR_EN); /* After trying for 5 seconds, give up */ k_sleep(K_SECONDS(5)); if (count++ > (5 * 1000) / 50) { SYS_LOG_ERR("DMA error: Stream in use\n"); return -EBUSY; } } return ret; }
static int amg88xx_init_device(struct device *dev) { struct amg88xx_data *drv_data = dev->driver_data; u8_t tmp; if (amg88xx_reg_read(drv_data, AMG88XX_PCLT, &tmp)) { SYS_LOG_ERR("Failed to read Power mode"); return -EIO; } SYS_LOG_DBG("Power mode 0x%02x", tmp); if (tmp != AMG88XX_PCLT_NORMAL_MODE) { if (amg88xx_reg_write(drv_data, AMG88XX_PCLT, AMG88XX_PCLT_NORMAL_MODE)) { return -EIO; } k_busy_wait(AMG88XX_WAIT_MODE_CHANGE_US); } if (amg88xx_reg_write(drv_data, AMG88XX_RST, AMG88XX_RST_INITIAL_RST)) { return -EIO; } k_busy_wait(AMG88XX_WAIT_INITIAL_RESET_US); if (amg88xx_reg_write(drv_data, AMG88XX_FPSC, AMG88XX_FPSC_10FPS)) { return -EIO; } SYS_LOG_DBG(""); return 0; }
static void rx_thread(void) { SYS_LOG_INF("RX thread started"); while (1) { struct net_pkt *pkt; struct net_buf *buf; u8_t specifier; pkt = k_fifo_get(&rx_queue, K_FOREVER); buf = net_buf_frag_last(pkt->frags); SYS_LOG_DBG("Got pkt %p buf %p", pkt, buf); hexdump("SLIP >", buf->data, buf->len); /* TODO: process */ specifier = net_buf_pull_u8(buf); switch (specifier) { case '?': process_request(buf); break; case '!': process_config(pkt); break; default: SYS_LOG_ERR("Unknown message specifier %c", specifier); break; } net_pkt_unref(pkt); k_yield(); } }
static void process_data(struct net_pkt *pkt) { struct net_buf *buf = net_buf_frag_last(pkt->frags); u8_t seq, num_attr; int ret, i; seq = net_buf_pull_u8(buf); num_attr = net_buf_pull_u8(buf); SYS_LOG_DBG("seq %u num_attr %u", seq, num_attr); /** * There are some attributes sent over this protocol * discard them and return packet data report. */ for (i = 0; i < num_attr; i++) { /* attr */ net_buf_pull_u8(buf); /* value */ net_buf_pull_be16(buf); } /* Transmit data through radio */ ret = radio_api->tx(ieee802154_dev, pkt, buf); if (ret) { SYS_LOG_ERR("Error transmit data"); } /* TODO: Return correct status codes */ /* TODO: Implement re-transmissions if needed */ /* Send packet data report */ send_pkt_report(seq, ret, 1); }
void main(void) { wpanusb_start(&__dev); SYS_LOG_INF("Start"); #if DYNAMIC_REGISTER ieee802154_dev = ieee802154_register_raw(); #else ieee802154_dev = device_get_binding(CONFIG_TI_CC2520_DRV_NAME); if (!ieee802154_dev) { SYS_LOG_ERR("Cannot get CC250 device"); return; } #endif /* Initialize nbufs */ net_nbuf_init(); /* Initialize transmit queue */ init_tx_queue(); radio_api = (struct ieee802154_radio_api *)ieee802154_dev->driver_api; /* TODO: Initialize more */ SYS_LOG_DBG("radio_api %p initialized", radio_api); SHELL_REGISTER("wpan", commands); }
static void dma_stm32_irq_handler(void *arg, u32_t id) { struct device *dev = arg; struct dma_stm32_device *ddata = dev->driver_data; struct dma_stm32_stream *stream = &ddata->stream[id]; u32_t irqstatus, config, sfcr; irqstatus = dma_stm32_irq_status(ddata, id); config = dma_stm32_read(ddata, DMA_STM32_SCR(id)); sfcr = dma_stm32_read(ddata, DMA_STM32_SFCR(id)); /* Silently ignore spurious transfer half complete IRQ */ if (irqstatus & DMA_STM32_HTI) { dma_stm32_irq_clear(ddata, id, DMA_STM32_HTI); return; } stream->busy = false; if ((irqstatus & DMA_STM32_TCI) && (config & DMA_STM32_SCR_TCIE)) { dma_stm32_irq_clear(ddata, id, DMA_STM32_TCI); stream->dma_callback(stream->dev, id, 0); } else { SYS_LOG_ERR("Internal error: IRQ status: 0x%x\n", irqstatus); dma_stm32_irq_clear(ddata, id, irqstatus); stream->dma_callback(stream->dev, id, -EIO); } }
int hts221_init_interrupt(struct device *dev) { struct hts221_data *drv_data = dev->driver_data; /* setup data ready gpio interrupt */ drv_data->gpio = device_get_binding(CONFIG_HTS221_GPIO_DEV_NAME); if (drv_data->gpio == NULL) { SYS_LOG_ERR("Cannot get pointer to %s device.", CONFIG_HTS221_GPIO_DEV_NAME); return -EINVAL; } gpio_pin_configure(drv_data->gpio, CONFIG_HTS221_GPIO_PIN_NUM, GPIO_DIR_IN | GPIO_INT | GPIO_INT_EDGE | GPIO_INT_ACTIVE_HIGH | GPIO_INT_DEBOUNCE); gpio_init_callback(&drv_data->gpio_cb, hts221_gpio_callback, BIT(CONFIG_HTS221_GPIO_PIN_NUM)); if (gpio_add_callback(drv_data->gpio, &drv_data->gpio_cb) < 0) { SYS_LOG_ERR("Could not set gpio callback."); return -EIO; } /* enable data-ready interrupt */ if (i2c_reg_write_byte(drv_data->i2c, HTS221_I2C_ADDR, HTS221_REG_CTRL3, HTS221_DRDY_EN) < 0) { SYS_LOG_ERR("Could not enable data-ready interrupt."); return -EIO; } #if defined(CONFIG_HTS221_TRIGGER_OWN_THREAD) k_sem_init(&drv_data->gpio_sem, 0, UINT_MAX); k_thread_spawn(drv_data->thread_stack, CONFIG_HTS221_THREAD_STACK_SIZE, (k_thread_entry_t)hts221_thread, POINTER_TO_INT(dev), 0, NULL, K_PRIO_COOP(CONFIG_HTS221_THREAD_PRIORITY), 0, 0); #elif defined(CONFIG_HTS221_TRIGGER_GLOBAL_THREAD) drv_data->work.handler = hts221_work_cb; drv_data->dev = dev; #endif gpio_pin_enable_callback(drv_data->gpio, CONFIG_HTS221_GPIO_PIN_NUM); return 0; }
static int fxas21002_channel_get(struct device *dev, enum sensor_channel chan, struct sensor_value *val) { const struct fxas21002_config *config = dev->config->config_info; struct fxas21002_data *data = dev->driver_data; int start_channel; int num_channels; s16_t *raw; int ret; int i; k_sem_take(&data->sem, K_FOREVER); /* Start with an error return code by default, then clear it if we find * a supported sensor channel. */ ret = -ENOTSUP; /* Convert raw gyroscope data to the normalized sensor_value type. */ switch (chan) { case SENSOR_CHAN_GYRO_X: start_channel = FXAS21002_CHANNEL_GYRO_X; num_channels = 1; break; case SENSOR_CHAN_GYRO_Y: start_channel = FXAS21002_CHANNEL_GYRO_Y; num_channels = 1; break; case SENSOR_CHAN_GYRO_Z: start_channel = FXAS21002_CHANNEL_GYRO_Z; num_channels = 1; break; case SENSOR_CHAN_GYRO_XYZ: start_channel = FXAS21002_CHANNEL_GYRO_X; num_channels = 3; break; default: start_channel = 0; num_channels = 0; break; } raw = &data->raw[start_channel]; for (i = 0; i < num_channels; i++) { fxas21002_convert(val++, *raw++, config->range); } if (num_channels > 0) { ret = 0; } if (ret != 0) { SYS_LOG_ERR("Unsupported sensor channel"); } k_sem_give(&data->sem); return ret; }
static void telnet_sent_cb(struct net_context *client, int status, void *token, void *user_data) { if (status) { telnet_end_client_connection(); SYS_LOG_ERR("Could not sent last packet"); } }
static void sendCSW(void) { csw.Signature = CSW_Signature; if (usb_write(EPBULK_IN, (uint8_t *)&csw, sizeof(struct CSW), NULL) != 0) { SYS_LOG_ERR("usb write failure"); } stage = WAIT_CSW; }
int adxl372_init_interrupt(struct device *dev) { struct adxl372_data *drv_data = dev->driver_data; const struct adxl372_dev_config *cfg = dev->config->config_info; drv_data->gpio = device_get_binding(cfg->gpio_port); if (drv_data->gpio == NULL) { SYS_LOG_ERR("Failed to get pointer to %s device!", cfg->gpio_port); return -EINVAL; } gpio_pin_configure(drv_data->gpio, cfg->int_gpio, GPIO_DIR_IN | GPIO_INT | GPIO_INT_EDGE | GPIO_INT_ACTIVE_HIGH | GPIO_INT_DEBOUNCE); gpio_init_callback(&drv_data->gpio_cb, adxl372_gpio_callback, BIT(cfg->int_gpio)); if (gpio_add_callback(drv_data->gpio, &drv_data->gpio_cb) < 0) { SYS_LOG_ERR("Failed to set gpio callback!"); return -EIO; } #if defined(CONFIG_ADXL372_TRIGGER_OWN_THREAD) k_sem_init(&drv_data->gpio_sem, 0, UINT_MAX); k_thread_create(&drv_data->thread, drv_data->thread_stack, CONFIG_ADXL372_THREAD_STACK_SIZE, (k_thread_entry_t)adxl372_thread, dev, 0, NULL, K_PRIO_COOP(CONFIG_ADXL372_THREAD_PRIORITY), 0, 0); #elif defined(CONFIG_ADXL372_TRIGGER_GLOBAL_THREAD) drv_data->work.handler = adxl372_work_cb; drv_data->dev = dev; #endif return 0; }
static int fxas21002_sample_fetch(struct device *dev, enum sensor_channel chan) { const struct fxas21002_config *config = dev->config->config_info; struct fxas21002_data *data = dev->driver_data; u8_t buffer[FXAS21002_MAX_NUM_BYTES]; s16_t *raw; int ret = 0; int i; if (chan != SENSOR_CHAN_ALL) { SYS_LOG_ERR("Unsupported sensor channel"); return -ENOTSUP; } k_sem_take(&data->sem, K_FOREVER); /* Read all the channels in one I2C transaction. */ if (i2c_burst_read(data->i2c, config->i2c_address, FXAS21002_REG_OUTXMSB, buffer, sizeof(buffer))) { SYS_LOG_ERR("Could not fetch sample"); ret = -EIO; goto exit; } /* Parse the buffer into raw channel data (16-bit integers). To save * RAM, store the data in raw format and wait to convert to the * normalized sensor_value type until later. */ raw = &data->raw[0]; for (i = 0; i < sizeof(buffer); i += 2) { *raw++ = (buffer[i] << 8) | (buffer[i+1]); } exit: k_sem_give(&data->sem); return ret; }
static int nrf5_stop(struct device *dev) { ARG_UNUSED(dev); if (!nrf_drv_radio802154_sleep()) { SYS_LOG_ERR("Error while stopping radio"); return -EIO; } SYS_LOG_DBG("nRF5 802154 radio stopped"); return 0; }
static void telnet_accept(struct net_context *client, struct sockaddr *addr, socklen_t addrlen, int error, void *user_data) { if (error) { SYS_LOG_ERR("Error %d", error); goto error; } if (client_cnx) { SYS_LOG_WRN("A telnet client is already in."); goto error; } if (net_context_recv(client, telnet_recv, 0, NULL)) { SYS_LOG_ERR("Unable to setup reception (family %u)", net_context_get_family(client)); goto error; } if (telnet_setup_out_pkt(client)) { goto error; } SYS_LOG_DBG("Telnet client connected (family AF_INET%s)", net_context_get_family(client) == AF_INET ? "" : "6"); orig_printk_hook = __printk_get_hook(); __printk_hook_install(telnet_console_out); client_cnx = client; k_timer_start(&send_timer, TELNET_TIMEOUT, TELNET_TIMEOUT); return; error: net_context_put(client); }