Lines Matching defs:ftdi

23 #include "ftdi.h"
62 static uint32_t ftdi_check_state(ftdi_t* ftdi) {
65 state |= list_is_empty(&ftdi->free_write_reqs) ? 0 : SERIAL_STATE_WRITABLE;
67 state |= list_is_empty(&ftdi->completed_reads) ? 0 : SERIAL_STATE_READABLE;
69 if (state != ftdi->state) {
70 ftdi->state = state;
71 if (ftdi->notify_cb) {
72 ftdi->notify_cb(state, ftdi->notify_cb_cookie);
79 ftdi_t* ftdi = (ftdi_t*)cookie;
83 usb_req_release(&ftdi->usb, request);
87 mtx_lock(&ftdi->mutex);
89 list_add_tail(&ftdi->completed_reads, &request->node);
90 ftdi_check_state(ftdi);
92 usb_request_queue(&ftdi->usb, request);
94 mtx_unlock(&ftdi->mutex);
98 ftdi_t* ftdi = (ftdi_t*)cookie;
101 usb_req_release(&ftdi->usb, request);
104 mtx_lock(&ftdi->mutex);
105 list_add_tail(&ftdi->free_write_reqs, &request->node);
106 ftdi_check_state(ftdi);
107 mtx_unlock(&ftdi->mutex);
141 ftdi_t* ftdi = ctx;
145 mtx_lock(&ftdi->mutex);
147 req = list_remove_head_type(&ftdi->free_write_reqs, usb_request_t, node);
154 *actual = usb_req_copy_to(&ftdi->usb, req, buf, length, 0);
157 usb_request_queue(&ftdi->usb,req);
158 ftdi_check_state(ftdi);
161 mtx_unlock(&ftdi->mutex);
167 ftdi_t* ftdi = ctx;
169 size_t offset = ftdi->read_offset;
172 mtx_lock(&ftdi->mutex);
174 usb_request_t* req = list_peek_head_type(&ftdi->completed_reads,
184 usb_req_copy_from(&ftdi->usb, req, &buffer[bytes_copied],
193 list_remove_head(&ftdi->completed_reads);
195 usb_request_queue(&ftdi->usb, req);
199 req = list_peek_head_type(&ftdi->completed_reads, usb_request_t, node);
201 ftdi_check_state(ftdi);
204 ftdi->read_offset = offset;
205 mtx_unlock(&ftdi->mutex);
211 static zx_status_t ftdi_set_baudrate(ftdi_t* ftdi, uint32_t baudrate){
215 if (ftdi == NULL) {
219 switch(ftdi->ftditype) {
224 ftdi->baudrate = baudrate;
231 status = usb_control(&ftdi->usb, USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
235 ftdi->baudrate = baudrate;
240 static zx_status_t ftdi_reset(ftdi_t* ftdi) {
242 if (ftdi == NULL || ftdi->usb_device == NULL) {
247 &ftdi->usb,
259 ftdi_t* ftdi = ctx;
261 if (baud_rate != ftdi->baudrate) {
262 return ftdi_set_baudrate(ftdi, baud_rate);
270 ftdi_t* ftdi = ctx;
271 memcpy(info, &ftdi->serial_port_info, sizeof(*info));
276 ftdi_t* ftdi = ctx;
277 ftdi->enabled = enable;
282 ftdi_t* ftdi = ctx;
284 if (ftdi->enabled) {
288 ftdi->notify_cb = cb;
289 ftdi->notify_cb_cookie = cookie;
291 mtx_lock(&ftdi->mutex);
292 ftdi_check_state(ftdi);
293 mtx_unlock(&ftdi->mutex);
309 static void ftdi_free(ftdi_t* ftdi) {
311 while ((req = list_remove_head_type(&ftdi->free_read_reqs, usb_request_t, node)) != NULL) {
312 usb_req_release(&ftdi->usb, req);
314 while ((req = list_remove_head_type(&ftdi->free_write_reqs, usb_request_t, node)) != NULL) {
315 usb_req_release(&ftdi->usb, req);
317 while ((req = list_remove_head_type(&ftdi->completed_reads, usb_request_t, node)) != NULL) {
318 usb_req_release(&ftdi->usb, req);
321 free(ftdi);
325 zxlogf(INFO,"releasing ftdi uart driver\n");
326 ftdi_t* ftdi = ctx;
327 ftdi_free(ftdi);
331 ftdi_t* ftdi = ctx;
332 device_remove(ftdi->usb_device);
384 ftdi_t* ftdi = calloc(1, sizeof(ftdi_t));
385 if (!ftdi) {
390 ftdi->ftditype = FTDI_TYPE_R;
392 list_initialize(&ftdi->free_read_reqs);
393 list_initialize(&ftdi->free_write_reqs);
394 list_initialize(&ftdi->completed_reads);
396 ftdi->usb_device = device;
398 memcpy(&ftdi->usb, &usb, sizeof(ftdi->usb));
400 mtx_init(&ftdi->mutex, mtx_plain);
404 status = usb_req_alloc(&ftdi->usb, &req, USB_BUF_SIZE, bulk_in_addr);
409 req->cookie = ftdi;
410 list_add_head(&ftdi->free_read_reqs, &req->node);
414 status = usb_req_alloc(&ftdi->usb, &req, USB_BUF_SIZE, bulk_out_addr);
419 req->cookie = ftdi;
420 list_add_head(&ftdi->free_write_reqs, &req->node);
423 if (ftdi_reset(ftdi) < 0) {
428 status = ftdi_set_baudrate(ftdi, 115200);
434 ftdi->serial_port_info.serial_class = SERIAL_CLASS_GENERIC;
438 .name = "ftdi-uart",
439 .ctx = ftdi,
445 status = device_add(ftdi->usb_device, &args, &ftdi->zxdev);
454 list_for_every_entry_safe (&ftdi->free_read_reqs, req, prev, usb_request_t, node) {
456 usb_request_queue(&ftdi->usb, req);
459 zxlogf(INFO,"ftdi bind successful\n");
464 ftdi_free(ftdi);
473 ZIRCON_DRIVER_BEGIN(ftdi, _ftdi_driver_ops, "zircon", "0.1", 3)
477 ZIRCON_DRIVER_END(ftdi)