static uint32_t cam_cci_wait(struct cci_device *cci_dev, enum cci_i2c_master_t master, enum cci_i2c_queue_t queue) { int32_t rc = 0; if (!cci_dev) { CAM_ERR(CAM_CCI, "failed"); return -EINVAL; } rc = wait_for_completion_timeout( &cci_dev->cci_master_info[master].report_q[queue], CCI_TIMEOUT); CAM_DBG(CAM_CCI, "wait DONE_for_completion_timeout"); if (rc <= 0) { cam_cci_dump_registers(cci_dev, master, queue); CAM_ERR(CAM_CCI, "wait for queue: %d", queue); if (rc == 0) rc = -ETIMEDOUT; cam_cci_flush_queue(cci_dev, master); return rc; } rc = cci_dev->cci_master_info[master].status; if (rc < 0) { CAM_ERR(CAM_CCI, "failed rc %d", rc); return rc; } return 0; }
时间: 2024-02-14 17:29:28 浏览: 495
这段代码是一个名为 `cam_cci_wait` 的函数,它用于等待一个特定的事件完成。函数的参数包括一个 `cci_device` 结构体指针、一个 `master` 枚举值和一个 `queue` 枚举值。
函数首先会检查传入的 `cci_dev` 是否为空,如果是空的话会返回错误码 `-EINVAL`。接下来,它会调用 `wait_for_completion_timeout` 函数来等待指定的事件发生,超时时间为 `CCI_TIMEOUT`。如果等待超时或者出现其他错误,函数会打印错误信息,并返回相应的错误码。如果等待成功,函数会返回 `cci_dev->cci_master_info[master].status` 的值,如果该值小于0,则会打印失败的错误信息。
最后,如果上述条件都不满足,则函数会返回0,表示等待成功。
请注意:上述代码片段可能是从某个具体的代码库中提取的,并且缺少了上下文信息。因此,我无法提供更多关于该代码功能和用途的详细信息。如果您有更多问题,请提供更多上下文或者详细说明您想要了解的内容。
相关问题
int32_t bsdtcp_server_send(const uint8_t *data, uint32_t num, int16_t sdidx, struct bsdtcp_server_ds *srv, uint32_t timeout) { struct client_conn_info *cci = NULL; char optval; uint32_t failcnt = 0; int32_t i = 0; int optlen = sizeof(optval); osStatus_t status = osError; int32_t sendcnt = -1; if (!data || num <= 0) goto exit; if (!srv || srv->magic != BSDTCP_SERVER_DS_MAGIC) goto exit; if (!srv->res || srv->res->magic != BSDTCP_SERVER_RES_MAGIC) goto exit; if (sdidx >= 0 && sdidx < srv->res->client_cnt) { if (sdidx == 0) cci = &srv->cci[0]; //srv->actcci; else cci = &srv->cci[sdidx]; if (cci->used && cci->active) { getsockopt(cci->sd, SOL_SOCKET, SO_KEEPALIVE, &optval, &optlen); if (optval == 0) goto ok; } } cci = srv->actcci; if (cci->used && cci->active) { getsockopt(cci->sd, SOL_SOCKET, SO_KEEPALIVE, &optval, &optlen); if (optval == 0) goto ok; } cci = &srv->cci[0]; for(i = 0; i < srv->res->client_cnt; i++) { if (cci->used && cci->active) { getsockopt(cci->sd, SOL_SOCKET, SO_KEEPALIVE, &optval, &optlen); if (optval == 0) { srv->actcci = cci; goto ok; } } cci++; } cci = NULL; goto exit; ok: sendcnt = cci_send(data, num, cci, timeout); exit: return (sendcnt); },解析这段代码
这段代码是函数 `bsdtcp_server_send` 的定义,它接受五个参数:`data`(要发送的数据的指针),`num`(要发送的数据的数量),`sdidx`(socket描述符索引),`srv`(指向 `bsdtcp_server_ds` 结构体的指针),以及 `timeout`(超时时间)。函数返回一个 `int32_t` 类型的发送计数。
首先,代码定义了一些变量,包括指向 `client_conn_info` 结构体的指针 `cci`,字符变量 `optval`,以及其他一些用于计数和状态的变量。
接下来,代码进行了一系列的条件判断。首先,检查传入的参数是否有效,包括 `data` 不为空且 `num` 大于零,以及 `srv` 和 `srv->res` 都不为空且具有正确的魔数。如果参数检查失败,代码通过 `goto exit` 跳转到函数结束处。
然后,代码根据给定的 `sdidx` 值来确定要使用的客户端连接信息 `cci`。如果 `sdidx` 在有效范围内且对应的连接被标记为使用且活动状态,则获取 `SO_KEEPALIVE` 套接字选项的值。如果该选项的值为0,则跳转到标签 `ok` 处。
如果没有找到合适的客户端连接信息,则使用默认的活动连接信息 `srv->actcci` 进行相同的操作。
如果仍然没有找到合适的客户端连接信息,则遍历所有的连接信息,直到找到一个 `SO_KEEPALIVE` 选项值为0的连接,并将其设置为活动连接信息。如果找到了合适的连接信息,则跳转到标签 `ok` 处。
在标签 `ok` 处,调用 `cci_send` 函数发送数据,并将返回值赋给 `sendcnt` 变量。
最后,通过 `goto exit` 跳转到函数结束处,在 `exit` 标签处返回 `sendcnt` 变量的值。
需要注意的是,这段代码只是一个函数定义,没有提供关于 `cci_send` 函数的具体实现细节。要完整理解代码的功能和行为,需要查看 `cci_send` 函数的实现代码。
阅读全文