nw_endpoint_handler_add_write_request

本文解决iOS10以上版本中特定网络请求错误日志频繁出现的问题,通过修改Xcode运行方案的环境变量,设置OS_ACTIVITY_MODE为disable,有效避免控制台打印相关log,提升开发体验。

2018-08-24 16:08:59.050039+0800 lepuClient[20496:4577171] [] nw_endpoint_handler_add_write_request [7.1 47.95.41.78:80 failed socket-flow (satisfied)] cannot accept write requests

2018-08-24 16:08:59.051411+0800 lepuClient[20496:4577198] [] tcp_connection_write_eof_block_invoke Write close callback received error: [22] Invalid argument

类似该类log信息,属于iOS10之后的一些网络打印,原因是由于进行网络请求之前的编码,具体细节本人也不太清楚,希望大牛看到后能私聊,不胜感激。

下边给大家介绍一种方法,可以使控制台不再打印该类log:

Xcode --> Product --> Scheme --> Edit Scheme --> Run --> Arguments --> Environment Variables

增加:OS_ACTIVITY_MODE :disable

如图参考:

搞定!!!

<think> 我们正在讨论Linux内核中设备树(Device Tree)相关的API,特别是`of_graph_get_next_endpoint`函数。根据用户提供的引用内容,我们可以分析该函数的功能和使用方法。 函数功能: `of_graph_get_next_endpoint`用于遍历设备树中某个节点(通常是端口节点)的所有端点(endpoint)。在设备树中,视频接口(如MIPI DSI、HDMI等)通常用图形表示,其中包含端口(ports)和端点(endpoints)。端口下包含多个端点,每个端点代表一个连接点。 使用方法: 该函数的原型为: ```c struct device_node *of_graph_get_next_endpoint(const struct device_node *parent, struct device_node *previous); ``` - `parent`:要遍历的端口节点(port node)。 - `previous`:前一个获取到的端点节点,如果是第一次调用则传入NULL。 - 返回值:下一个端点节点(endpoint node),如果没有更多端点则返回NULL。 注意:每次调用该函数获取到一个端点节点后,当不再需要该节点时,必须调用`of_node_put`来释放节点引用,以避免内存泄漏。 在引用[2]中,我们看到了`of_fwnode_graph_get_next_endpoint`函数,它是`fwnode_operations`结构体中的`graph_get_next_endpoint`操作的具体实现。它调用了`of_graph_get_next_endpoint`,并进行了fwnode handle和device node之间的转换。 引用[1]展示了`of_graph_get_remote_endpoint`的代码片段,该函数用于获取当前端点的对端端点(即通过remote-endpoint属性指向的端点)。而`of_graph_get_next_endpoint`则是用于遍历同一端口下的所有端点。 引用[4]展示了`of_fwnode_ops`结构体,其中`graph_get_next_endpoint`成员被初始化为`of_fwnode_graph_get_next_endpoint`,这说明了设备树(OF)对fwnode操作的实现。 使用示例: 假设我们有一个设备树节点`port`,我们想遍历它的所有端点: ```c struct device_node *port; // 假设已经指向了某个端口节点 struct device_node *ep = NULL; while ((ep = of_graph_get_next_endpoint(port, ep)) != NULL) { // 对端点ep进行处理 // 例如,获取该端点的对端端点 struct device_node *remote_ep = of_graph_get_remote_endpoint(ep); if (remote_ep) { // 处理remote_ep of_node_put(remote_ep); } // 注意:在循环内部不能释放ep,因为下一次循环还要用 // 但是每次循环结束时,我们通过of_node_put(ep)来释放 of_node_put(ep); // 释放当前端点 } ``` 注意:在循环中,每次使用完端点后,都需要调用`of_node_put`来释放节点的引用。但是,由于`of_graph_get_next_endpoint`在内部会使用`of_node_get`来增加引用计数,所以我们需要在每次迭代结束时释放。 另外,在获取对端端点(remote-endpoint)时,同样也会增加引用计数,所以使用完后也要释放。 相关函数: - `of_graph_get_remote_endpoint`:获取端点的对端端点。 - `of_graph_get_port_parent`:获取端口节点的父节点(通常是设备节点)。 在引用[5]中提到了最佳实践,包括引用管理(获取后必须释放)和查找效率等,这些原则同样适用于图形相关的节点遍历。 总结: `of_graph_get_next_endpoint`是Linux内核设备树图形接口中用于遍历端口下端点的重要函数,常用于多媒体、显示等驱动中,用于解析设备之间的连接关系。 相关问题: 1. 如何获取设备树中端点的属性? 2. 在设备树中,如何表示两个节点之间的图形连接? 3. 除了端点,设备树图形接口中还有哪些关键节点? </think> ### `of_graph_get_next_endpoint` 功能详解 `of_graph_get_next_endpoint` 是 Linux 设备树(Device Tree)API 中的关键函数,主要用于遍历设备树中的图形(graph)节点结构。其核心功能是**按顺序获取指定父节点的下一个可用端点(endpoint)节点**,在多媒体/显示驱动(如 MIPI DSI、HDMI 等)的设备树解析中尤为重要。 #### 一、函数原型与参数 ```c struct device_node *of_graph_get_next_endpoint( const struct device_node *parent, struct device_node *prev ); ``` - **`parent`**: 要遍历的父节点(通常为端口节点 `port`) - **`prev`**: 前一个已处理的端点节点,首次调用时设为 `NULL` - **返回值**: 下一个端点节点的指针,无更多节点时返回 `NULL` #### 二、核心功能解析 1. **图形结构遍历** 设备树中图形结构通常组织为: ``` device-node (e.g., display-controller) │ └── ports // 父节点 ├── port@0 // 端口 │ ├── endpoint@0 // 端点1 │ └── endpoint@1 // 端点2 └── port@1 └── endpoint@0 ``` `of_graph_get_next_endpoint` 按顺序遍历 `port` 下的 `endpoint` 子节点。 2. **与 fwnode 的关联** 通过引用[2][4]可知,该函数被映射到 fwnode 操作接口: ```c static struct fwnode_handle *of_fwnode_graph_get_next_endpoint( const struct fwnode_handle *fwnode, struct fwnode_handle *prev ) { return of_fwnode_handle(of_graph_get_next_endpoint( to_of_node(fwnode), to_of_node(prev) )); } ``` 这实现了设备树节点(`device_node`)与通用固件节点(`fwnode_handle`)的转换[^2][^4]。 3. **节点过滤机制** 类似引用[3]的 `of_get_next_available_child`,它仅返回**可用节点**(跳过 `status = "disabled"` 的节点)[^3]。 #### 三、典型使用流程 ```c // 获取端口节点(如 from = parent->ports) struct device_node *port = ...; struct device_node *ep = NULL; while ((ep = of_graph_get_next_endpoint(port, ep))) { // 1. 解析端点属性 of_property_read_u32(ep, "data-lanes", &lane_count); // 2. 获取远程端点(对端设备) struct device_node *remote_ep = of_graph_get_remote_endpoint(ep); struct device_node *remote_dev = of_graph_get_port_parent(remote_ep); // 3. 必须释放节点引用! of_node_put(remote_ep); of_node_put(remote_dev); } ``` #### 四、关键应用场景 1. **显示驱动初始化** 解析 MIPI DSI/DPI 控制器的输出端口配置: ```c // drivers/gpu/drm/bridge/ti-sn65dsi86.c ep = of_graph_get_next_endpoint(dev->of_node, NULL); while (ep) { // 配置时序参数 of_get_drm_display_mode(ep, &mode); ep = of_graph_get_next_endpoint(dev->of_node, ep); } ``` 2. **摄像头传感器绑定** 在 CSI 驱动中匹配传感器节点: ```c // drivers/media/i2c/ov5640.c ep = of_graph_get_next_endpoint(dev->of_node, NULL); remote = of_graph_get_remote_port_parent(ep); sensor_dev = of_find_i2c_device_by_node(remote); ``` #### 五、使用注意事项 1. **引用计数管理** 每次调用会增加节点引用计数,必须用 `of_node_put()` 释放[^5]。 2. **错误处理** 始终检查返回值: ```c if (!ep) { dev_err(dev, "No endpoint found!"); return -ENODEV; } ``` 3. **性能优化** 对于高频访问的节点(如显示控制器),建议缓存端点引用而非重复遍历[^5]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值