活动介绍
file-type

VBA编程挑战:股市数据分析与报告生成

ZIP文件

下载需积分: 5 | 4KB | 更新于2025-09-03 | 54 浏览量 | 0 下载量 举报 收藏
download 立即下载
在本家庭作业中,您将使用VBA(Visual Basic for Applications)脚本来分析股市数据。VBA是微软公司开发的一种集成在Microsoft Office应用程序中的编程语言,主要用于自动化Office套件中的任务和增强应用程序的功能。在本知识点中,我将详细解释VBA的基本概念、如何在Excel中使用VBA、以及如何通过VBA分析股市数据。 ### VBA基础知识 VBA是一种事件驱动的编程语言,允许用户编写宏来自动化任务,使重复的工作流程变得更加高效。VBA可用于所有Office组件中,如Excel、Word、PowerPoint等,但在Excel中的应用尤为广泛。 VBA中的几个核心概念包括: - **模块(Modules)**:模块是包含代码的容器,用于存放VBA过程和函数。 - **过程(Procedures)**:过程是执行特定任务的代码块,分为两种类型,子程序(Sub)和函数(Function)。子程序执行任务但不返回值,而函数执行任务并返回值。 - **对象(Objects)**:VBA使用对象模型,其中Excel中的每个元素如工作簿、工作表、单元格等都是对象。对象包含方法(操作对象的动作)和属性(对象的特征)。 - **事件(Events)**:事件是响应用户操作或发生的事情,例如点击按钮或打开工作簿。 ### 在Excel中使用VBA 在Excel中,VBA的使用通常涉及以下步骤: 1. **打开VBA编辑器**:通过在Excel中按下`Alt + F11`快捷键打开VBA编辑器。 2. **插入模块**:在VBA编辑器中,右键点击相应的工作簿,选择`插入` -> `模块`,创建一个新的模块。 3. **编写代码**:在新模块的代码窗口中,编写VBA代码来定义要执行的操作。 4. **运行宏**:在Excel中可以通过开发者工具栏或快捷键`Alt + F8`来运行已经定义好的宏。 ### 分析股市数据的VBA脚本 在此作业中,您需要创建一个VBA脚本来分析股市数据。要实现该功能,您需要编写一个VBA程序来执行以下任务: 1. **循环遍历一年内的股票数据**:您的程序需要遍历一个包含一年内股票交易数据的工作表。 2. **计算开盘价和收盘价的变化**:对于每只股票,您需要计算年初的开盘价和年末的收盘价,然后计算这两个价格之间的绝对变化和百分比变化。 3. **条件格式化输出结果**:使用VBA中的`Format`函数或`Range`对象的`Interior.Color`属性,根据计算结果将正向变化标记为绿色,负向变化标记为红色。 ### 股市数据报告的输出 最终的作业报告应展示以下信息: - 股票代码。 - 年初开盘价到年末收盘价的年度变化。 - 年初开盘价到年末收盘价的百分比变化。 - 年末的总库存量。 这些数据可能存储在Excel的一个或多个工作表中,您需要确保VBA脚本能正确地访问和计算这些数据。 ### Jupyter Notebook标签 本家庭作业提到了标签“JupyterNotebook”,这表明它与Jupyter Notebook有某种关联。Jupyter Notebook是一个开源的Web应用程序,允许创建和共享包含实时代码、方程式、可视化和说明性文本的文档。不过,尽管标题和描述强调了VBA,但在本作业中并没有直接提及Jupyter Notebook的使用。如果Jupyter Notebook在本作业中有特定的角色,那么可能是用于项目管理、代码共享或结果呈现等方面。 ### 总结 通过完成这个VBA家庭作业,您不仅能够加深对VBA编程的理解,还能练习如何使用VBA来处理和分析实际数据。此外,完成此作业也有助于提高您对股市数据结构及其分析方法的认识。在编写VBA脚本时,务必确保代码的逻辑清晰和功能准确,以便能够正确地生成您需要的报告。

相关推荐

filetype

16:09:16.231420 [schedu][0xa862fb48180][08:09:16.218040]kiwi_v2: [4494:D:WMA] 00000000: 00 00 00 00 38 00 00 00 00 00 00 00 00 02 00 00 16:09:16.231421 [schedu][0xa862fb481d6][08:09:16.218044]kiwi_v2: [4494:D:WMA] 00000010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 16:09:16.231422 [schedu][0xa862fb4828d][08:09:16.218054]kiwi_v2: [4494:D:WMI] Send cmd WMI_ADD_BCN_FILTER_CMDID(0x12001) tag:0 16:09:16.231434 [schedu][0xa862fb483b9][08:09:16.218070]kiwi_v2: [4494:D:PE] LIM handle SME Msg Unknown(5238) 16:09:16.231435 [schedu][0xa862fb484b3][08:09:16.218083]kiwi_v2: [4494:D:PE] populate_dot11f_ext_cap: 11MC - enabled for non-SAP cases 16:09:16.231436 [schedu][0xa862fb4859c][08:09:16.218095]kiwi_v2: [4494:D:PE] lim_merge_extcap_struct: source extended capabilities length:11 16:09:16.231436 [schedu][0xa862fb485ee][08:09:16.218099]kiwi_v2: [4494:D:PE] 00000000: 00 00 0a 82 01 40 40 00 00 01 20 16:09:16.231437 [schedu][0xa862fb48658][08:09:16.218105]kiwi_v2: [4494:D:PE] lim_merge_extcap_struct: destination extended capabilities length: 11 16:09:16.231439 [schedu][0xa862fb486ad][08:09:16.218109]kiwi_v2: [4494:D:PE] 00000000: 04 00 0a 82 01 40 40 40 80 21 20 16:09:16.231439 [schedu][0xa862fb487a3][08:09:16.218122]kiwi_v2: [4494:D:WMA] Handle msg WMA_SET_IE_INFO(0x116e) 16:09:16.231440 [schedu][0xa862fb4881e][08:09:16.218128]kiwi_v2: [4494:D:WMA] wma_process_set_ie_info: vdev id: 0, ie_id: 127, band: 0, len: 11 16:09:16.231441 [schedu][0xa862fb48871][08:09:16.218133]kiwi_v2: [4494:D:WMA] 00000000: 04 00 0a 82 01 40 40 40 80 21 20 16:09:16.231442 [schedu][0xa862fb48909][08:09:16.218140]kiwi_v2: [4494:D:WMI] send_process_set_ie_info_cmd_tlv: IE:127 of size:11 sent for vdev:0 16:09:16.231443 [schedu][0xa862fb489e4][08:09:16.218152]kiwi_v2: [4494:D:WMI] Send cmd WMI_VDEV_SET_IE_CMDID(0x5013) tag:0 16:09:16.231444 [schedu][0xa862fb48af6][08:09:16.218166]kiwi_v2: [4494:D:POLICY_MGR] policy_mgr_hw_mode_transition_cb: HW mode: old 0 new 0, DBS 0 Agile 0 SBS 0, MAC0:: SS:Tx 2 Rx 2, BW 8 band 3, MAC1:: SS:Tx 0 Rx 0, BW 0 16:09:16.231445 [schedu][0xa862fb48b56][08:09:16.218171]kiwi_v2: [4494:D:POLICY_MGR] Vdev Map:: vdev 0 -> mac 0 16:09:16.231446 [schedu][0xa862fb48bb3][08:09:16.218176]kiwi_v2: [4494:D:POLICY_MGR] policy_mgr_update_hw_mode_conn_info: vdev:0, mac:0 16:09:16.231447 [schedu][0xa862fb48c2f][08:09:16.218182]kiwi_v2: [4494:D:POLICY_MGR] policy_mgr_dump_connection_status_info: 0: use:1 vdev:0 mode:0 mac:0 freq:2437 orig chainmask:1 orig nss:2 bw:4, ch_flags 0 16:09:16.231448 [schedu][0xa862fb48c93][08:09:16.218188]kiwi_v2: [4494:D:POLICY_MGR] PLCY_MGR_FREQ_RANGE_CUR: mac 0: 2Ghz: 2412 -> 2484, 5Ghz: 5180 -> 7115 16:09:16.231464 [schedu][0xa862fb48cf3][08:09:16.218193]kiwi_v2: [4494:D:HDD] wlan_hdd_send_mode_change_event: enter 16:09:16.231465 [schedu][0xa862fb49ac0][08:09:16.218377]kiwi_v2: [4494:D:HDD] wlan_hdd_send_mode_change_event: exit 16:09:16.231466 [schedu][0xa862fb49ceb][08:09:16.218406]kiwi_v2: [4494:D:HDD] hdd_sme_roam_callback: CSR Callback: status=eCSR_ROAM_TSM_IE_IND (34) result= eCSR_ROAM_RESULT_NONE (0) 16:09:16.231467 [schedu][0xa862fb49d89][08:09:16.218414]kiwi_v2: [4494:D:HDD] hdd_indicate_tsm_ie: TSM Ind tid(0) state(0) MeasInt(0) 16:09:16.231468 [schedu][0xa862fb49e3e][08:09:16.218423]kiwi_v2: [4494:D:tdls] tdls_process_cmd: TDLS_DELETE_ALL_PEERS_INDICATION(24) 16:09:16.231469 [wpa_su][0xa862fb4cdd5][08:09:16.219058]kiwi_v2: [6311:D:HDD] __wlan_hdd_cfg80211_dump_survey: chan_info is NULL 16:09:16.231470 [kworke][0xa862fb4ebe5][08:09:16.219459]kiwi_v2: [31340:D:OSIF] osif_twt_concurrency_update_handler: Total connection 1, sta_count 1, sap_count 0 16:09:16.231471 [kworke][0xa862fb4ecf6][08:09:16.219473]kiwi_v2: [31340:D:TWT] wlan_twt_requestor_enable: TWT req enable: pdev_id:0 cong:0 bcast:1 rtwt:0 16:09:16.231472 [kworke][0xa862fb4ed4c][08:09:16.219477]kiwi_v2: [31340:D:TWT] wlan_twt_requestor_enable: TWT req enable: role:0 ext:1 oper:1 16:09:16.231473 [kworke][0xa862fb4eecd][08:09:16.219497]kiwi_v2: [31340:D:WMI] Send cmd WMI_TWT_ENABLE_CMDID(0x3e001) tag:0 16:09:16.231474 [soft_i][0xa862fb50766][08:09:16.219825]kiwi_v2: [0:I:TXRX] HTT_T2H_MSG_TYPE_PEER_UNMAP msg for peer id 19 vdev id 0 n 16:09:16.231475 [soft_i][0xa862fb50a11][08:09:16.219861]kiwi_v2: [0:IH:DP] dp_rx_peer_unmap_handler: peer_unmap_event (soc:0000000000000000) peer_id 19 peer 0000000000000000 16:09:16.231476 [soft_i][0xa862fb50c4a][08:09:16.219891]kiwi_v2: [0:F:DP] dp_peer_update_state: Invalid state shift from 2 to 4 peer f6:38:9e:**:**:e1 16:09:16.231477 [soft_i][0xa862fb50d65][08:09:16.219905]kiwi_v2: [0:IH:DP] dp_peer_update_state: Updating peer state from 2 to 4 mac f6:38:9e:**:**:e1 16:09:16.231478 [soft_i][0xa862fb50ddf][08:09:16.219912]kiwi_v2: [0:IH:DP_PEER] dp_peer_unref_delete: Deleting peer 0000000000000000 (f6:38:9e:**:**:e1) 16:09:16.231490 [soft_i][0xa862fb50e4f][08:09:16.219918]kiwi_v2: [0:IH:DP] dp_peer_update_state: Updating peer state from 4 to 5 mac f6:38:9e:**:**:e1 16:09:16.231492 [soft_i][0xa862fb50f1b][08:09:16.219928]kiwi_v2: [0:IH:DP] dp_peer_rx_cleanup: Remove tids for peer: 0000000000000000 16:09:16.231493 [soft_i][0xa862fb50fe1][08:09:16.219938]kiwi_v2: [0:IH:DP] dp_rx_reorder_flush_frag: Flushing TID 0 16:09:16.231494 [soft_i][0xa862fb510e0][08:09:16.219952]kiwi_v2: [0:IH:DP_PEER] dp_rx_tid_delete_cb: 0000000000000000: rx_tid: 0 status: 0 16:09:16.231495 [soft_i][0xa862fb5282a][08:09:16.220262]kiwi_v2: [0:IH:DP] dp_rx_tid_delete_cb: fail to send CMD_CACHE_FLUSH:tid 15 desc 0000000000000000 16:09:16.231496 [soft_i][0xa862fb53068][08:09:16.220372]kiwi_v2: [0:IH:DP_PEER] dp_rx_tid_delete_cb: 0000000000000000: rx_tid: 1 status: 0 16:09:16.231497 [soft_i][0xa862fb53138][08:09:16.220383]kiwi_v2: [0:IH:DP_PEER] dp_rx_tid_delete_cb: 0000000000000000: rx_tid: 2 status: 0 16:09:16.231497 [soft_i][0xa862fb531d8][08:09:16.220391]kiwi_v2: [0:IH:DP] dp_rx_tid_delete_cb: fail to send REO cmd to flush cache: tid 16 16:09:16.231498 [soft_i][0xa862fb5329a][08:09:16.220401]kiwi_v2: [0:IH:DP_PEER] dp_rx_tid_delete_cb: 0000000000000000: rx_tid: 3 status: 0 16:09:16.231499 [soft_i][0xa862fb5337d][08:09:16.220413]kiwi_v2: [0:IH:DP_PEER] dp_rx_tid_delete_cb: 0000000000000000: rx_tid: 4 status: 0 16:09:16.231500 [soft_i][0xa862fb5344f][08:09:16.220424]kiwi_v2: [0:IH:DP_PEER] dp_rx_tid_delete_cb: 0000000000000000: rx_tid: 5 status: 0 16:09:16.231501 [soft_i][0xa862fb53512][08:09:16.220434]kiwi_v2: [0:IH:DP_PEER] dp_rx_tid_delete_cb: 0000000000000000: rx_tid: 6 status: 0 16:09:16.231502 [soft_i][0xa862fb53618][08:09:16.220448]kiwi_v2: [0:IH:DP_PEER] dp_rx_tid_delete_cb: 0000000000000000: rx_tid: 7 status: 0 16:09:16.231503 [soft_i][0xa862fb536eb][08:09:16.220459]kiwi_v2: [0:IH:DP_PEER] dp_rx_tid_delete_cb: 0000000000000000: rx_tid: 8 status: 0 16:09:16.231504 [soft_i][0xa862fb537ca][08:09:16.220471]kiwi_v2: [0:IH:DP_PEER] dp_rx_tid_delete_cb: 0000000000000000: rx_tid: 9 status: 0 16:09:16.231505 [soft_i][0xa862fb5389b][08:09:16.220481]kiwi_v2: [0:IH:DP_PEER] dp_rx_tid_delete_cb: 0000000000000000: rx_tid: 10 status: 0 16:09:16.231516 [soft_i][0xa862fb5395c][08:09:16.220492]kiwi_v2: [0:IH:DP_PEER] dp_rx_tid_delete_cb: 0000000000000000: rx_tid: 11 status: 0 16:09:16.231518 [soft_i][0xa862fb5459b][08:09:16.220655]kiwi_v2: [0:IH:DP_PEER] dp_rx_tid_delete_cb: 0000000000000000: rx_tid: 12 status: 0 16:09:16.231519 [soft_i][0xa862fb54685][08:09:16.220667]kiwi_v2: [0:IH:DP_PEER] dp_rx_tid_delete_cb: 0000000000000000: rx_tid: 13 status: 0 16:09:16.231520 [soft_i][0xa862fb5473b][08:09:16.220676]kiwi_v2: [0:IH:DP_PEER] dp_rx_tid_delete_cb: 0000000000000000: rx_tid: 14 status: 0 16:09:16.231520 [soft_i][0xa862fb54802][08:09:16.220687]kiwi_v2: [0:IH:DP_PEER] dp_rx_tid_delete_cb: 0000000000000000: rx_tid: 15 status: 0 16:09:16.231521 [soft_i][0xa862fb548b9][08:09:16.220696]kiwi_v2: [0:IH:DP_PEER] dp_rx_tid_delete_cb: 0000000000000000: rx_tid: 16 status: 0 16:09:16.231522 [soft_i][0xa862fb549e8][08:09:16.220712]kiwi_v2: [0:IH:DP_PEER] dp_peer_unref_delete: Deleted peer. Unref vdev 0000000000000000, vdev_ref_cnt 5 16:09:16.231523 [soft_i][0xa862fb551d0][08:09:16.220818]kiwi_v2: [0:IH:DP_HTT] dp_htt_t2h_msg_handler: HTT_T2H_MSG_TYPE_PEER_MAP_V3 msg for peer id 20 vdev id 0 n 16:09:16.231524 [soft_i][0xa862fb552ab][08:09:16.220829]kiwi_v2: [0:IH:DP] dp_rx_peer_map_handler: peer_map_event (soc:0000000000000000): peer_id 20, hw_peer_id 63, peer_mac 0a:f2:2c:**:**:a9, vdev_id 0 16:09:16.231525 [soft_i][0xa862fb55376][08:09:16.220840]kiwi_v2: [0:IH:DP_PEER] dp_peer_find_add_id: 0000000000000000: ref_cnt: 4 16:09:16.231526 [soft_i][0xa862fb5543d][08:09:16.220850]kiwi_v2: [0:IH:DP] dp_peer_update_state: Updating peer state from 1 to 2 mac 0a:f2:2c:**:**:a9 16:09:16.231528 [soft_i][0xa862fb554c9][08:09:16.220857]kiwi_v2: [0:IH:DP] dp_rx_peer_map_handler: 0000000000000000: STA vdev bss_peer 16:09:16.231529 [soft_i][0xa862fb55548][08:09:16.220864]kiwi_v2: [0:IH:DP] dp_rx_peer_map_handler: bss ast_hash 0xf, ast_index 0x3f 16:09:16.231530 [soft_i][0xa862fb555d8][08:09:16.220871]kiwi_v2: [0:IH:DP] dp_rx_peer_map_handler: Add self ast from map 0a:f2:2c:**:**:a9 16:09:16.231531 [soft_i][0xa862fb557ad][08:09:16.220896]kiwi_v2: [0:IH:DP_PEER] dp_addba_requestprocess_wifi3: 0000000000000000: restore BA win 64 based on addba req 16:09:16.231542 [soft_i][0xa862fb5583d][08:09:16.220903]kiwi_v2: [0:IH:DP] dp_check_ba_buffersize: Input buffersize 64, max dp allowed 1024 16:09:16.231543 [soft_i][0xa862fb55901][08:09:16.220913]kiwi_v2: [0:IH:DP] dp_check_ba_buffersize: 0a:f2:2c:**:**:a9 per_tid_basize_max_tid 8 tid 5 buffersize 64 hw_buffer_size 0 16:09:16.231544 [soft_i][0xa862fb559a3][08:09:16.220922]kiwi_v2: [0:IH:DP] dp_check_ba_buffersize: rx_tid->ba_win_size 64 peer->hw_buffer_size 0 peer->kill_256_sessions 0 16:09:16.231545 [soft_i][0xa862fb55a39][08:09:16.220930]kiwi_v2: [0:IH:DP_PEER] dp_rx_tid_setup_wifi3: tid_bitmap 0x20, ba_window_size 64, start_seq 65535 16:09:16.231546 [soft_i][0xa862fb55af4][08:09:16.220939]kiwi_v2: [0:W:HAL] hal_reo_cmd_update_rx_queue_be: Out of cmd ring entries 16:09:16.231547 [soft_i][0xa862fb55c61][08:09:16.220958]kiwi_v2: [0:IH:DP] dp_rx_tid_update_wifi3: failed to send reo cmd CMD_UPDATE_RX_REO_QUEUE 16:09:16.231548 [soft_i][0xa862fb55cf1][08:09:16.220966]kiwi_v2: [0:IH:DP] dp_get_vdevid: peer 0000000000000000 vdev 0000000000000000 vdev id 0 16:09:16.231549 [soft_i][0xa862fb55dcf][08:09:16.220977]kiwi_v2: [0:IH:DP_PEER] dp_get_peer_vdev_roaming_in_progress: peer: 0a:f2:2c:**:**:a9, vdev_id: 0, is_roaming: 0 16:09:16.231550 [soft_i][0xa862fb55ebc][08:09:16.220990]kiwi_v2: [0:IH:DP_PEER] dp_rx_tid_setup_wifi3: Update tid 5 16:09:16.231551 [soft_i][0xa862fb55f36][08:09:16.220996]kiwi_v2: [0:IH:DP_PEER] dp_rx_tid_setup_wifi3: tid_bitmap=0, no tid setup, setup_fail_cnt 0 16:09:16.231552 [soft_i][0xa862fb55fd0][08:09:16.221004]kiwi_v2: [0:IH:DP] dp_rx_tid_update_wifi3: failed to send reo cmd CMD_UPDATE_RX_REO_QUEUE 16:09:16.231553 [soft_i][0xa862fb5605d][08:09:16.221012]kiwi_v2: [0:IH:DP] dp_get_vdevid: peer 0000000000000000 vdev 0000000000000000 vdev id 0 16:09:16.231554 [soft_i][0xa862fb560fa][08:09:16.221020]kiwi_v2: [0:IH:DP_PEER] dp_get_peer_vdev_roaming_in_progress: peer: 0a:f2:2c:**:**:a9, vdev_id: 0, is_roaming: 0 16:09:16.231555 [soft_i][0xa862fb561e8][08:09:16.221032]kiwi_v2: [0:IH:DP] dp_addba_resp_tx_completion_wifi3: tid 5 window_size 64 start_seq_num 65535 16:09:16.231556 [soft_i][0xa862fb5629d][08:09:16.221042]kiwi_v2: [0:IH:DP] dp_htt_rx_addba_handler: PeerID 20 BAW 64 TID 5 stat 0 16:09:16.231568 [soft_i][0xa862fb57c46][08:09:16.221384]kiwi_v2: [0:IH:DP_PEER] dp_reo_desc_free: 0000000000000000: 17331715932 hw_qdesc_paddr: 0000000000000000, tid:0 16:09:16.231569 [soft_i][0xa862fb57d4b][08:09:16.221397]kiwi_v2: [0:IH:DP_PEER] dp_reo_desc_free: 0000000000000000: 17331715932 hw_qdesc_paddr: 0000000000000000, tid:10 16:09:16.231570 [soft_i][0xa862fb57e0f][08:09:16.221408]kiwi_v2: [0:IH:DP_PEER] dp_reo_desc_free: 0000000000000000: 17331715932 hw_qdesc_paddr: 0000000000000000, tid:1 16:09:16.231571 [soft_i][0xa862fb57ec2][08:09:16.221417]kiwi_v2: [0:IH:DP_PEER] dp_reo_desc_free: 0000000000000000: 17331715932 hw_qdesc_paddr: 0000000000000000, tid:11 16:09:16.231572 [wpa_su][0xa862fb5838a][08:09:16.221481]kiwi_v2: [6311:D:HDD] __hdd_netdev_notifier_call: enter(wlan0) 16:09:16.231573 [wpa_su][0xa862fb58428][08:09:16.221489]kiwi_v2: [6311:D:HDD] __hdd_netdev_notifier_call: wlan0 New Net Device State = 4, flags 0x1003 16:09:16.231574 [soft_i][0xa862fb58cb3][08:09:16.221603]kiwi_v2: [0:IH:DP_PEER] dp_reo_desc_free: 0000000000000000: 17331715932 hw_qdesc_paddr: 0000000000000000, tid:2 16:09:16.231574 [soft_i][0xa862fb58d79][08:09:16.221613]kiwi_v2: [0:IH:DP_PEER] dp_reo_desc_free: 0000000000000000: 17331715932 hw_qdesc_paddr: 0000000000000000, tid:12 16:09:16.231575 [soft_i][0xa862fb58e48][08:09:16.221624]kiwi_v2: [0:IH:DP_PEER] dp_reo_desc_free: 0000000000000000: 17331715932 hw_qdesc_paddr: 0000000000000000, tid:3 16:09:16.231576 [soft_i][0xa862fb58efc][08:09:16.221633]kiwi_v2: [0:IH:DP_PEER] dp_reo_desc_free: 0000000000000000: 17331715932 hw_qdesc_paddr: 0000000000000000, tid:13 16:09:16.231577 [soft_i][0xa862fb58fc1][08:09:16.221643]kiwi_v2: [0:IH:DP_PEER] dp_reo_desc_free: 0000000000000000: 17331715932 hw_qdesc_paddr: 0000000000000000, tid:4 16:09:16.231578 [soft_i][0xa862fb59094][08:09:16.221654]kiwi_v2: [0:IH:DP_PEER] dp_reo_desc_free: 0000000000000000: 17331715932 hw_qdesc_paddr: 0000000000000000, tid:14 16:09:16.231579 [soft_i][0xa862fb5915c][08:09:16.221665]kiwi_v2: [0:IH:DP_PEER] dp_reo_desc_free: 0000000000000000: 17331715932 hw_qdesc_paddr: 0000000000000000, tid:5 16:09:16.231580 [wpa_su][0xa862fb5c74c][08:09:16.222384]kiwi_v2: [6311:D:HDD] __wlan_hdd_cfg80211_del_key: enter 16:09:16.231591 [wpa_su][0xa862fb5c79f][08:09:16.222388]kiwi_v2: [6311:D:HDD] __wlan_hdd_cfg80211_del_key: Peer mac address is NULL 16:09:16.231592 [wpa_su][0xa862fb5c7d5][08:09:16.222391]kiwi_v2: [6311:D:HDD] __wlan_hdd_cfg80211_del_key: exit 16:09:16.231593 [wpa_su][0xa862fb5cd58][08:09:16.222465]kiwi_v2: [6311:D:HDD] __wlan_hdd_cfg80211_del_key: enter 16:09:16.231594 [wpa_su][0xa862fb5cd7a][08:09:16.222466]kiwi_v2: [6311:D:HDD] __wlan_hdd_cfg80211_del_key: Peer mac address is NULL 16:09:16.231595 [wpa_su][0xa862fb5cd98][08:09:16.222468]kiwi_v2: [6311:D:HDD] __wlan_hdd_cfg80211_del_key: exit 16:09:16.231596 [wpa_su][0xa862fb5d1e4][08:09:16.222525]kiwi_v2: [6311:D:HDD] __wlan_hdd_cfg80211_del_key: enter 16:09:16.231597 [wpa_su][0xa862fb5d27e][08:09:16.222533]kiwi_v2: [6311:D:HDD] __wlan_hdd_cfg80211_del_key: exit 16:09:16.231598 [wpa_su][0xa862fb676fa][08:09:16.224727]kiwi_v2: [6311:D:HDD] __hdd_netdev_notifier_call: enter(wlan0) 16:09:16.231599 [wpa_su][0xa862fb67768][08:09:16.224732]kiwi_v2: [6311:D:HDD] __hdd_netdev_notifier_call: wlan0 New Net Device State = 4, flags 0x1003 16:09:16.231600 [wpa_su][0xa862fb6a9fe][08:09:16.225407]kiwi_v2: [6311:D:HDD] __wlan_hdd_cfg80211_get_channel: enter(wlan0) 16:09:16.231601 [wpa_su][0xa862fb6ab65][08:09:16.225425]kiwi_v2: [6311:D:mlme] wlan_mlme_get_ch_width_from_phymode: phymode: 26, ch_width: 1 16:09:16.231602 [wpa_su][0xa862fb6abd1][08:09:16.225431]kiwi_v2: [6311:D:HDD] __wlan_hdd_cfg80211_get_channel: primary_freq:2437, ch_width:2, center_freq1:2427, center_freq2:0 16:09:16.231603 [wpa_su][0xa862fb6ac1e][08:09:16.225435]kiwi_v2: [6311:D:HDD] __wlan_hdd_cfg80211_get_txpower: enter(wlan0) 16:09:16.231604 [wpa_su][0xa862fb6ac9b][08:09:16.225441]kiwi_v2: [6311:D:HDD] __wlan_hdd_cfg80211_get_txpower: Modules not enabled/rate limited, cached tx power = 22 16:09:16.231605 [wpa_su][0xa862fb6b0a9][08:09:16.225495]kiwi_v2: [6311:D:HDD] __wlan_hdd_cfg80211_get_channel: enter(wlan0) 16:09:16.231606 [wpa_su][0xa862fb6b11c][08:09:16.225501]kiwi_v2: [6311:D:mlme] wlan_mlme_get_ch_width_from_phymode: phymode: 26, ch_width: 1 16:09:16.231607 [wpa_su][0xa862fb6b15c][08:09:16.225505]kiwi_v2: [6311:D:HDD] __wlan_hdd_cfg80211_get_channel: primary_freq:2437, ch_width:2, center_freq1:2427, center_freq2:0 16:09:16.231697 [wpa_su][0xa862fb6b190][08:09:16.225507]kiwi_v2: [6311:D:HDD] __wlan_hdd_cfg80211_get_txpower: enter(wlan0) 16:09:16.231699 [wpa_su][0xa862fb6b4bb][08:09:16.225550]kiwi_v2: [6311:D:HDD] __wlan_hdd_cfg80211_get_txpower: Modules not enabled/rate limited, cached tx power = 22 16:09:16.231700 [schedu][0xa862fb735ea][08:09:16.227272]kiwi_v2: [4494:I:CMN_MLME] [08:09:15.755000] [ROAM_TRIGGER]: VDEV[0] Reason: "LOW RSSI" Cur_Rssi threshold:79 Current AP RSSI: 77 16:09:16.231701 [schedu][0xa862fb73c83][08:09:16.227360]kiwi_v2: [4494:I:CMN_MLME] [08:09:15.755000] [ROAM_SCAN]: VDEV[0] Scan_type: PARTIAL next_rssi_threshold: 79 dBm {2437 2462 } 16:09:16.231702 [schedu][0xa862fb73d0b][08:09:16.227367]kiwi_v2: [4494:I:CMN_MLME] ============================================================================================================================ 16:09:16.231703 [schedu][0xa862fb73dae][08:09:16.227376]kiwi_v2: [4494:I:CMN_MLME] AP BSSID TSTAMP CH TY ETP RSSI/SCR CU%/SCR TOT_SCR BL_RSN BL_SRC BL_TSTAMP BL_TIMEOUT(ms) 16:09:16.231704 [schedu][0xa862fb73e07][08:09:16.227380]kiwi_v2: [4494:I:CMN_MLME] ============================================================================================================================ 16:09:16.231705 [schedu][0xa862fb73ea1][08:09:16.227388]kiwi_v2: [4494:I:CMN_MLME] f6:38:9e:**:**:e1 [08:09:15.755000] 2462 P_AP 0 77/880 0/1000 1954 0 0 [00:00:00.000000] 0 16:09:16.231706 [schedu][0xa862fb742bf][08:09:16.227443]kiwi_v2: [4494:I:CMN_MLME] 0a:f2:2c:**:**:a9 [08:09:15.784000] 2437 R_AP 256 36/2000 50/1000 5260 0 0 [00:00:00.000000] 0 16:09:16.231707 [schedu][0xa862fb7471b][08:09:16.227501]kiwi_v2: [4494:I:CMN_MLME] [08:09:16.217000] [ROAM_RESULT]: VDEV[0] SUCCESS

filetype

/* * Copyright 1994, 1995, 2000 Neil Russell. * (See License) * Copyright 2000, 2001 DENX Software Engineering, Wolfgang Denk, [email protected] */ #include "http_upgrade.h" #include <command.h> #include <net.h> #include <asm/byteorder.h> #include "lib_uip.h" #include "rsaVerify.h" #include "md5.h" #include "malloc.h" #include "uip_drv.h" DECLARE_GLOBAL_DATA_PTR; #ifdef CFG_EXTRA_FW #define WORD_ALIGN(p) (((unsigned int)(p)+3)&~3) typedef struct _FileBlockEntry { uint32_t blk_type; uint32_t length; }FileBlockEntry; /* * file block partition format is as this: * file_block_header - block entries - file block 1 - file block 2 ... */ typedef struct file_block_header { uint32_t nBlk; FileBlockEntry BlkEntries[1]; }file_block_header_t; #endif #ifndef UIP_FLASH_BASE #define UIP_FLASH_BASE CFG_FLASH_BASE #endif #ifndef UIP_FLASH_SIZE #define UIP_FLASH_SIZE CFG_FLASH_SIZE #endif #define MD5SUM_LEN 16 #define HW_ID_LEN 16 #define FW_ID_LEN 16 #define FINFO_DEVNAME_LEN 64 #define FINFO_HWVER_LEN 21 #define FACTORY_INFO_MAC_KEY "mac:" #define FACTORY_INFO_HWID_KEY "hwId:" #define FACTORY_INFO_FWID_KEY "RcvrfwId:" #define FACTORY_INFO_DEV_NAME_KEY "devName:" #define FACTORY_INFO_HW_VER_KEY "hwVer:" /* Vendor Id's. */ #define VENDOR_ID_TP 0x00 #define VENDOR_ID_MECURY 0x01 #define VENDOR_ID_FAST 0x02 #define VENDOR_ID_PROWARE 0x35 /* RSA public Keys. */ char publicKeyTP[] = "BgIAAACkAABSU0ExAAQAAAEAAQA1Ccyu85b65TawjvSQTaryGNk1gBJVn6kEIJq6m0hagsqkiy32v4ui41ucp6tKfaoqb7AHDBq41dcEMgM6YBF2e3aRKQqZ6EwgCvAi3O81n7UbE97lD+FhvqlYxyqqMbSdvNmCiAoujheUs9DUaOCHq4K3McDxATMVOnCtT1H+wQ=="; char publicKeyMercury[] = "BgIAAACkAABSU0ExAAQAAAEAAQD7Bk7f7fdnL9drucbr+P9wA2JUlYP/OH4zvIS69eY3KKmUB1fs9ND06EINqTQ4vQ4gCeekU1dRi3WiZLgVjo/UzovplddUezNMWq0gk4TVbsGf/xzXZN+pDWid9zYsSr9qvINId6cnMR+s/wXB1TOE6t6wfzHvnbkJR0r1mqG4yA=="; char publicKeyFast[] = "BgIAAACkAABSU0ExAAQAAAEAAQAHNt5fFl0BUlLkPjKJloZFlVFkegFjEsVJCRjwbRD6i646tpvc/Z5MK6SuXcz3yizxDGMnZ6BJdqCR9SJTdd3b11F7Q+pgetcAgX5X9NZTzo1MCvpkKAlEyZG0rXMpSbADNNqtACNT0BLhHu4nyiDBBIIOSZljQAzHiqSquxHDsg=="; char publicKeyProware[] = "BgIAAACkAABSU0ExAAQAAAEAAQArjNXuvBeCGfOD19AGJGmceW+ip5W76C+sOHk0bJgrtZhk+t/ZzZwAv/TLA+MwNipNZSd+fOysmqDsA53cEIKdzor0WbWGq0n/BYr1o8fh4Pm656mOn9C6LH6nCf6w48Nog84Pc+NuwHcB93p6Wj0y3YVl8sGn+eeokA8ltZzLnA=="; /* Firmware information structure. */ typedef struct _FW_INFO { unsigned char* buf; int size; int uhTagLength; int local_fw_size; }FW_INFO; static FW_INFO fw_info = {0}; /* Local uboot infomation structure. */ typedef struct _LOCAL_INFO { uint8_t hwID[HW_ID_LEN]; uint8_t fwID[FW_ID_LEN]; uint8_t mac[6]; #ifdef UNIFY_FIRMWARE uint8_t device_model[FINFO_DEVNAME_LEN]; uint8_t hw_version[FINFO_HWVER_LEN]; #endif } LOCAL_INFO; static LOCAL_INFO localInfo = {{0}}; /* define tp header */ #define TP_HEADER_VERSION 0x00000100 #define MAGIC_LEN 20 #define CRC_LEN 16 #define FW_DESC_LEN 12 #define PARTITION_NUMBER 9 typedef struct _TP_HEADER { unsigned int headerVersion; unsigned char magicNumber[MAGIC_LEN]; unsigned int kernelLoadAddress; unsigned int kernelEntryPoint; unsigned short vendorId; unsigned short zoneCode; unsigned int partitionNum; unsigned int factoryBootOffset; unsigned int factoryBootLen; unsigned int factoryInfoOffset; unsigned int factoryInfoLen; unsigned int radioOffset; unsigned int radioLen; unsigned int ucOffset; unsigned int ucLen; unsigned int bootloaderOffset; unsigned int bootloaderLen; unsigned int tpHeaderOffset; unsigned int tpHeaderLen; unsigned int kernelOffset; unsigned int kernelLen; unsigned int romFsOffset; unsigned int romFsLen; unsigned int jffs2FsOffset; unsigned int jffs2FsLen; unsigned char factoryInfoCRC[CRC_LEN]; unsigned char radioCRC[CRC_LEN]; unsigned char ubootCRC[CRC_LEN]; unsigned char kernelAndRomfsCRC[CRC_LEN]; unsigned char fwId[FW_ID_LEN]; unsigned char fwDescription[FW_DESC_LEN]; unsigned int fwIdBLNum; unsigned char fwIdBL[0][FW_ID_LEN]; } TP_HEADER; /* content type flags. */ #define CONTENT_TYPE_BOOTLOADER 0x0001 #define CONTENT_TYPE_KERNEL 0x0002 #define CONTENT_TYPE_ROMFS 0x0004 #define CONTENT_TYPE_JFFS2FS 0x0008 #define CONTENT_TYPE_ISP_CONFIG 0x0010 /* partition type flags. */ #define PARTITION_TYPE_BOOTLOADER CONTENT_TYPE_BOOTLOADER #define PARTITION_TYPE_KERNEL CONTENT_TYPE_KERNEL #define PARTITION_TYPE_FACTORY_INFO 0x0100 #define PARTITION_TYPE_RADIO_DATA 0x0200 /* firmware bin contents */ #define PARTS_UP_BOOT (CONTENT_TYPE_BOOTLOADER | CONTENT_TYPE_KERNEL | CONTENT_TYPE_ROMFS | CONTENT_TYPE_JFFS2FS) #define PARTS_UP (CONTENT_TYPE_KERNEL | CONTENT_TYPE_ROMFS | CONTENT_TYPE_JFFS2FS) #define PARTS_UP_BOOT_NOJFS (CONTENT_TYPE_BOOTLOADER | CONTENT_TYPE_KERNEL | CONTENT_TYPE_ROMFS) #define PARTS_UP_NOJFS (CONTENT_TYPE_KERNEL | CONTENT_TYPE_ROMFS) /* define upgrade header */ #define UPGRADE_HEADER_VERSION 0x00000100 #define UPGRADE_HEADER_LEN 512 #define UPGRADE_HEADER_LEN_WIDE (2 * UPGRADE_HEADER_LEN) #define RSA_SIGN_LEN 128 #define FWID_FL_MASK_LEN 12 #define HW_ID_LEN 16 typedef struct _UPGRADE_HEADER { unsigned int headerVersion; unsigned char magicNumber[MAGIC_LEN]; unsigned short tagLength; unsigned short vendorId; unsigned short zoneCode; unsigned short contentTypes; unsigned char rsaSignature[RSA_SIGN_LEN]; unsigned short hwIdNum; unsigned short fwIdFLNum; unsigned char fwIdFLMask[FWID_FL_MASK_LEN]; unsigned char hwIdList[0][HW_ID_LEN]; // unsigned char fwIdFL[0][FW_ID_LEN]; } UPGRADE_HEADER; /* Allowed recovery FwID */ const char RECOVERY_FW_ID[FW_ID_LEN] = {WEBFAILSAFE_FW_ID}; #ifdef UNIFY_FIRMWARE static unsigned char blockHdrMagicNumber[] = {0x12, 0x34, 0x56, 0x78}; static int checkFirmwareIsp(BLOCK_HEADER* blockHdr, void* thisHandler); static int upgradeFirmwareIsp(EXT_FW_HEADER* block); static EXT_FW_BLOCK_HANDLER blockHdrTbl[] = { { CONTENT_TYPE_ISP_CONFIG, EXT_FW_CHANGED, NULL, checkFirmwareIsp, upgradeFirmwareIsp }, { 0, 0, NULL, NULL, NULL } }; #endif void get_eth_addr(uint8_t* addr) { memcpy(addr, localInfo.mac, 6); } /* * Function Name: localInfoInit * Author: CaiBin * Date: 2014-11-07 * Description: Initialize local firmware information(currently only HwID). * Parameter: * VOID * return: * 0: Succeeded; * ERR_GENERIC: No HwID found. * ERR_READ_FLASH: Read command execution error. * ERR_BAD_ADDRESS: Invalid address values passed. */ static int localInfoInit(void) { int ret = 0; uint8_t *buf = NULL; uint8_t *p = NULL; memset(&localInfo, 0, sizeof(localInfo)); memcpy(localInfo.fwID, RECOVERY_FW_ID, FW_ID_LEN); buf = (uint8_t*)malloc(FACTORY_INFO_LEN); if (!buf) { ERR("malloc failed."); ret = ERR_MEMORY_ALLOC; goto out; } ret = readFlash(FACTORY_INFO_OFFSET, buf, FACTORY_INFO_LEN); if (ret < 0) { ERR("read flash failed."); goto out_free_buf; } #ifdef RECOVERY_UPGRADE_UNIT_TEST { int i; DBG_UNIT("content:"); for (i=0, p = buf; i < FACTORY_INFO_LEN; p++, i++) { if ((*p >= 'a' && *p <= 'z') || (*p >= 'A' && *p <= 'Z') || (*p >= '0' && *p <= '9')) { printf("%c ", *p); } else { printf("%02X ", (int)*p); } } printf("\n"); } #endif //read mac address p = (uint8_t *)memmem(buf, FACTORY_INFO_LEN, FACTORY_INFO_MAC_KEY, strlen(FACTORY_INFO_MAC_KEY)); if (NULL == p) { ERR("no mac address found"); ret = ERR_HWID_NOT_FOUND; goto out_free_buf; } DBG_UNIT("find offset:%d", p-buf); memcpy(localInfo.mac, p + strlen(FACTORY_INFO_MAC_KEY), 6); //read hwID p = (uint8_t *)memmem(buf, FACTORY_INFO_LEN, FACTORY_INFO_HWID_KEY, strlen(FACTORY_INFO_HWID_KEY)); if (NULL == p) { ERR("no HwID found"); ret = ERR_HWID_NOT_FOUND; goto out_free_buf; } DBG_UNIT("find offset:%d", p-buf); memcpy(localInfo.hwID, p + strlen(FACTORY_INFO_HWID_KEY), HW_ID_LEN); //read fwID #ifdef FETCH_FW_ID_FROM_FACTORY_INFO p = (uint8_t *)memmem(buf, FACTORY_INFO_LEN, FACTORY_INFO_FWID_KEY, strlen(FACTORY_INFO_FWID_KEY)); if (NULL == p) { ERR("no FwID found"); ret = ERR_FWID_NOT_FOUND; goto out_free_buf; } DBG_UNIT("find offset:%d", p-buf); memcpy(localInfo.fwID, p + strlen(FACTORY_INFO_FWID_KEY), FW_ID_LEN); #endif #ifdef UNIFY_FIRMWARE //read device_model p = (uint8_t *)memmem(buf, FACTORY_INFO_LEN, FACTORY_INFO_DEV_NAME_KEY, strlen(FACTORY_INFO_DEV_NAME_KEY)); if (NULL == p || strlen(FACTORY_INFO_DEV_NAME_KEY) == strlen(p)) { ERR("no device_model found"); ret = ERR_DEV_NAME_NOT_FOUND; goto out_free_buf; } memcpy(localInfo.device_model, p + strlen(FACTORY_INFO_DEV_NAME_KEY), strlen(p) - strlen(FACTORY_INFO_DEV_NAME_KEY)); DBG_UNIT("localInfo.device_model: %s", localInfo.device_model); //read hw_version p = (uint8_t *)memmem(buf, FACTORY_INFO_LEN, FACTORY_INFO_HW_VER_KEY, strlen(FACTORY_INFO_HW_VER_KEY)); if (NULL == p|| strlen(FACTORY_INFO_HW_VER_KEY) == strlen(p)) { ERR("no hw_version found"); ret = ERR_HW_VER_NOT_FOUND; goto out_free_buf; } memcpy(localInfo.hw_version, p + strlen(FACTORY_INFO_HW_VER_KEY), strlen(p) - strlen(FACTORY_INFO_HW_VER_KEY)); DBG_UNIT("localInfo.hw_version: %s", localInfo.hw_version); #endif #ifdef RECOVERY_UPGRADE_UNIT_TEST { int i; DBG_UNIT("got MAC:"); for(i=0; i<6; i++) { printf("%02X ",localInfo.mac[i]); } printf("\n"); DBG_UNIT("got hwID:"); for(i=0; i<HW_ID_LEN; i++) { printf("%02X ",localInfo.hwID[i]); } printf("\n"); DBG_UNIT("got fwID:"); for(i=0; i<FW_ID_LEN; i++) { printf("%02X ",localInfo.fwID[i]); } printf("\n"); } #endif out_free_buf: free(buf); out: return ret; } /* * Function Name: check_file_size * Author: CaiBin * Date: 2014-11-07 * Description: Check if firmware has valid size. * Parameter: * size: Size of the firmware in bytes. * return: * 0: Succeeded; * ERR_INCORRECT_FILE_SIZE: File size is incorrect. */ static int check_file_size(ulong size) { #ifdef UNIFY_FIRMWARE if (size < BOOTLOADER_LEN) #else if ((size < BOOTLOADER_LEN) || (size > CFG_FLASH_SIZE)) #endif { ERR("data size check failed."); return ERR_INCORRECT_FILE_SIZE; } return 0; } /* * Function Name: calcMd5 * Author: CaiBin * Date: 2014-11-07 * Description: Compute MD5 checksum. * Parameter: * data: Source data . * size: Source data length. * md5: return the result md5 value. * return: * VOID */ static void calcMd5(char *data, int size, char *md5) { MD5_CTX ctx; MD5_Init(&ctx); MD5_Update(&ctx, data, size); MD5_Final(md5, &ctx); } /* * Function Name: checkFirmwareRSA * Author: CaiBin * Date: 2014-11-07 * Description: Check RSA signature of the upgrading firmware. * Parameter: * uHeader: Points to the upgrade header of the firmware. * info: Points to the information of the firmware. * return: * 0: Succeeded; * ERR_RSA_CHECK_FAIL: Signature is incorrect. */ static int checkFirmwareRSA(UPGRADE_HEADER* uHeader, FW_INFO* info) { int signCheckOk = 0; /* for RSA sign check result */ unsigned char md5Tmp[MD5SUM_LEN] = {0}; unsigned char rsaTmp[RSA_SIGN_LEN] = {0}; char* publicKey = NULL; //get public key by vendorId. switch (ntohs(uHeader->vendorId)) { case VENDOR_ID_TP: DBG_UNIT("TP key selected."); publicKey = publicKeyTP; break; case VENDOR_ID_MECURY: DBG_UNIT("Mercury key selected."); publicKey = publicKeyMercury; break; case VENDOR_ID_FAST: DBG_UNIT("Fast key selected."); publicKey = publicKeyFast; break; case VENDOR_ID_PROWARE: DBG_UNIT("Proware key selected."); publicKey = publicKeyProware; break; default: DBG_UNIT("no key available."); //VendorID not exist, regard as RSA check failed. ERR("RSA check failed."); return ERR_RSA_CHECK_FAIL; } //backup RSA sign first. memcpy(rsaTmp, uHeader->rsaSignature, RSA_SIGN_LEN); memset(uHeader->rsaSignature, 0x0, RSA_SIGN_LEN); DBG_UNIT("calc MD5.") calcMd5((char*)uHeader, info->size, (char*)md5Tmp); #ifdef RECOVERY_UPGRADE_UNIT_TEST { int i; DBG_UNIT("Desired RSA:"); for (i=0; i<RSA_SIGN_LEN; i++) { printf("%02X ",rsaTmp[i]); } printf("\n"); DBG_UNIT("MD5:"); for (i=0; i<MD5SUM_LEN; i++) { printf("%02X ",md5Tmp[i]); } printf("\n"); } #endif DBG_UNIT("RSA verify..."); signCheckOk = rsaVerifySignByBase64EncodePublicKeyBlob( (unsigned char*)publicKey, strlen(publicKey), md5Tmp, MD5SUM_LEN, rsaTmp, RSA_SIGN_LEN); if (!signCheckOk) { ERR("RSA check failed."); return ERR_RSA_CHECK_FAIL; } //restore RSA sign. memcpy(uHeader->rsaSignature, rsaTmp, RSA_SIGN_LEN); DBG("firmware RSA signiture check OK"); return 0; } /* * Function Name: checkFirmwareHwList * Author: CaiBin * Date: 2014-11-07 * Description: Check if HwID is supported in the HwID List of the firmware. * Parameter: * uHeader: Points to the upgrade header of the firmware. * return: * 0: Succeeded; * ERR_HWID_NOT_SUPPORTED: HwID is not supported. */ static int checkFirmwareHwList(UPGRADE_HEADER* uHeader) { int i = 0; int hwIdIsSupported = ERR_HWID_NOT_SUPPORTED; for (i = 0; i < ntohs(uHeader->hwIdNum); i++) { int j; DBG_UNIT("HwID:"); #ifdef RECOVERY_UPGRADE_UNIT_TEST for (j = 0; j < HW_ID_LEN; j++) { printf("%02X ", uHeader->hwIdList[i][j]); } printf("\n"); #endif if (memcmp(localInfo.hwID, uHeader->hwIdList[i], HW_ID_LEN) == 0) { DBG("firmware support my HwID"); hwIdIsSupported = 0; break; } } if (hwIdIsSupported < 0) { DBG("firmware not support my HwID"); } return hwIdIsSupported; } /* * Function Name: checkFirmwareID * Author: CaiBin * Date: 2014-11-07 * Description: Check if FwID is supported in the HwID List of the firmware. * Only the designated FwID is permitted. * Parameter: * Header: Points to the TP Header of the upgrading firmware. * return: * 0: Succeeded; * ERR_FWID_NOT_SUPPORTED: FwID is not supported. */ static int checkFirmwareID(TP_HEADER* header) { if(memcmp(header->fwId, localInfo.fwID, FW_ID_LEN) != 0) { ERR("Firmware ID not supported."); return ERR_FWID_NOT_SUPPORTED; } return 0; } /* * Function Name: checkFirmwarePartition * Author: CaiBin * Date: 2014-11-07 * Description: Check if firmware has all partitions. * Parameter: * uHeader: Points to the upgrade header of the firmware. * info: Points to the information of the firmware. * return: * 0: Succeeded; * ERR_PARTITION_TYPE_NOT_SUPPORTED: Firmware has not all partitions. */ static int checkFirmwarePartition(UPGRADE_HEADER* uHeader, FW_INFO* info) { //firmware content type. uint32_t fwContents = 0x0; //get the content parts of firmware. fwContents = ntohs(uHeader->contentTypes); //up_boot.bin only. if ((fwContents & PARTS_UP_BOOT) != PARTS_UP_BOOT) { ERR("content-type not supported."); return ERR_PARTITION_TYPE_NOT_SUPPORTED; } return 0; } /* * Function Name: validatePartitions * Author: CaiBin * Date: 2014-11-07 * Description: Check valid firmware partitions. * Validate partition offsets,lengths and CRC's in TP Header. * Parameter: * header: Points to the TP Header partition of the firmware image to validate. * return: * 0: Succeeded; * ERR_INVALID_TP_HEADER: Firmware has not all partitions. * ERR_PARTITION_VALIDATION_FAILED: Partition CRC verification failed. */ static int validatePartitions(TP_HEADER* header, uint32_t partition_type) { int ret = 0; //array of validation crc's. unsigned char* crc[] = {header ->factoryInfoCRC, header->radioCRC, header->ubootCRC, header->kernelAndRomfsCRC}; //array of partition offsets. uint32_t offset[] = {FACTORY_INFO_OFFSET, RADIO_OFFSET, BOOTLOADER_OFFSET, KERNEL_ROMFS_OFFSET}; //array of partition lengths. uint32_t length[] = {FACTORY_INFO_LEN, RADIO_LEN, BOOTLOADER_LEN, ntohl(header->kernelLen) + ntohl(header->romFsLen)}; //array of messages. char* dbg_msg[] = {"factory info", "radio data", "uboot", "kernel and romfs"}; //array of partition type flags to decide which partition to be validated. uint32_t partition_flags[] = {PARTITION_TYPE_FACTORY_INFO, PARTITION_TYPE_RADIO_DATA, PARTITION_TYPE_BOOTLOADER, PARTITION_TYPE_KERNEL}; unsigned char md5Tmp[MD5SUM_LEN] = {0}; unsigned char* base = NULL; int i; #ifndef CONFIG_RELOC_FIXUP_WORKS //relocate pointers for (i=0; i<sizeof(dbg_msg)/sizeof(char*); i++) { dbg_msg[i] += gd->reloc_off; } #endif DBG_UNIT("Validating partitions..."); DBG_UNIT("Factory Boot Offset: %x, Length: %x", ntohl(header->factoryBootOffset), ntohl(header->factoryBootLen)); if(ntohl(header->factoryBootOffset) != FACTORY_BOOT_OFFSET || ntohl(header->factoryBootLen) != FACTORY_BOOT_LEN) { return ERR_INVALID_TP_HEADER; } DBG_UNIT("Factory Info Offset: %x, Length: %x", ntohl(header->factoryInfoOffset), ntohl(header->factoryInfoLen)); if(ntohl(header->factoryInfoOffset) != FACTORY_INFO_OFFSET || ntohl(header->factoryInfoLen) != FACTORY_INFO_LEN) { return ERR_INVALID_TP_HEADER; } DBG_UNIT("Radio Offset: %x, Length: %x", ntohl(header->radioOffset), ntohl(header->radioLen)); if(ntohl(header->radioOffset) != RADIO_OFFSET || ntohl(header->radioLen) != RADIO_LEN) { return ERR_INVALID_TP_HEADER; } DBG_UNIT("User Config Offset: %x, Length: %x", ntohl(header->ucOffset), ntohl(header->ucLen)); if(ntohl(header->ucOffset) != UC_OFFSET || ntohl(header->ucLen) != UC_LEN) { return ERR_INVALID_TP_HEADER; } DBG_UNIT("UBoot Offset: %x, Length: %x", ntohl(header->bootloaderOffset), ntohl(header->bootloaderLen)); if(ntohl(header->bootloaderOffset) != BOOTLOADER_OFFSET || ntohl(header->bootloaderLen) != BOOTLOADER_LEN) { return ERR_INVALID_TP_HEADER; } DBG_UNIT("TP Header Offset: %x, Length: %x", ntohl(header->tpHeaderOffset), ntohl(header->tpHeaderLen)); if(ntohl(header->tpHeaderOffset) != TP_HEADER_OFFSET || ntohl(header->tpHeaderLen) != TP_HEADER_LEN) { return ERR_INVALID_TP_HEADER; } DBG_UNIT("Kernel Offset: %x, Length: %x", ntohl(header->kernelOffset), ntohl(header->kernelLen)); if(ntohl(header->kernelOffset) != KERNEL_ROMFS_OFFSET) { return ERR_INVALID_TP_HEADER; } DBG_UNIT("Romfs Offset: %x, Length: %x", ntohl(header->romFsOffset), ntohl(header->romFsLen)); DBG_UNIT("JFFS2 Offset: %x, Length: %x", ntohl(header->jffs2FsOffset), ntohl(header->jffs2FsLen)); if(ntohl(header->kernelLen) + ntohl(header->romFsLen) + ntohl(header->jffs2FsLen) + KERNEL_ROMFS_OFFSET != UIP_FLASH_SIZE) { return ERR_INVALID_TP_HEADER; } //verifying partition CRC. base = (char *)header - ntohl(header->tpHeaderOffset); for (i = 0; i < sizeof(crc)/sizeof(char*); i++) { if(partition_type & partition_flags[i]) { DBG("verifying %s partition...", dbg_msg[i]); memset(md5Tmp, 0, MD5SUM_LEN); DBG_UNIT("base: %p, offset: %p, length: %x", base, base+offset[i], (int)length[i]); calcMd5((char *)(base+offset[i]), (int)length[i], (char *)md5Tmp); if (memcmp(md5Tmp, crc[i], MD5SUM_LEN) == 0) { DBG("ok"); } else { DBG("failed"); ret = ERR_PARTITION_VALIDATION_FAILED; break; } } } return ret; } /* * Function Name: checkFirmware * Author: CaiBin * Date: 2014-11-07 * Description: Check if firmware is valid. * Parameter: * info: Points to the information of the firmware. * return: * 0: Succeeded; * ERR_INCORRECT_FILE_SIZE: File size is incorrect. * ERR_RSA_CHECK_FAIL: Signature is incorrect. * ERR_HWID_NOT_SUPPORTED: HwID is not supported. * ERR_PARTITION_TYPE_NOT_SUPPORTED: Firmware has not all partitions. */ static int checkFirmware(FW_INFO* info) { int ret = 0; UPGRADE_HEADER* uHeader = NULL; TP_HEADER* header; unsigned char* buf = info->buf; uHeader = (UPGRADE_HEADER*)buf; //get firmware's upgrade header length and get its tp header. info->uhTagLength = ntohs(uHeader->tagLength); header = (TP_HEADER*)(buf + info->uhTagLength + BOOTLOADER_LEN); DBG_UNIT("taglength: %d", info->uhTagLength); //check file size. ret = check_file_size(info->size); if(ret < 0) { return ret; } #ifdef WEBFAILSAFE_UPGRADE_CHECK_RSA //check rsa signiture if needed. ret = checkFirmwareRSA(uHeader, info); if (ret < 0) { return ret; } #endif //check if HwID in firmware support HwID list. ret = checkFirmwareHwList(uHeader); if (ret < 0) { ERR("Hardware not supported."); return ret; } //check FwID of the upgrading firmware. /*ret = checkFirmwareID(header); if(ret < 0) { return ret; }*/ //check firmware partitions are enough and if contents are changed ret = checkFirmwarePartition(uHeader, info); if (ret < 0) { return ret; } //validate uploaded firmware partitions. ret = validatePartitions(header, ntohs(uHeader->contentTypes)); if (ret < 0) { return ret; } DBG("firmware check finished, ok to upgrade"); return 0; } /* * Function Name: executeUpgrade * Author: CaiBin * Date: 2014-11-07 * Description: Do actual upgrade work. * Parameter: * addrOffset: Flash address to be copyed to. * base: Points to the data to be copyed. * size: Data size to be copyed in bytes. * return: * 0: Succeeded; * ERR_WRITE_FLASH: Write command execution error. * ERR_READ_FLASH: Read command execution error. * ERR_ERASE_FLASH: Erase command execution error. * ERR_BAD_ADDRESS: Invalid address values passed. */ static int executeUpgrade(uint32_t addrOffset, char* base, uint32_t size) { int ret = 0; DBG("execute upgrade..."); DBG_UNIT("write offset: %x, from: %p, size: %x", addrOffset, base, size); //erase copy region. ret = eraseFlash(addrOffset, size); if (ret < 0) { ERR("erase flash failed!"); return ret; } //start to write firmware. ret = writeFlash(addrOffset, (uint8_t*)base, size); if (ret < 0) { ERR("write flash failed!"); return ret; } return 0; } /* * Function Name: upgradeFirmware * Author: CaiBin * Date: 2014-11-07 * Description: Do upgrade. * Parameter: * info: Points to the information of the firmware. * return: * 0: Succeeded; * ERR_WRITE_FLASH: Write command execution error. * ERR_READ_FLASH: Read command execution error. * ERR_ERASE_FLASH: Erase command execution error. * ERR_BAD_ADDRESS: Invalid address values passed. */ static int upgradeFirmware(FW_INFO* info) { int ret = 0; TP_HEADER* header; char* base = 0; uint32_t size = 0; char* buf = (char*)info->buf; uint32_t addrOffset; base = buf + info->uhTagLength; header = (TP_HEADER*)(buf + info->uhTagLength + BOOTLOADER_LEN); #ifdef UNIFY_FIRMWARE /* 共用固件方案的升级文件尾部还有各机型的ISP_CONFIG文件 */ size = ntohl(header->bootloaderLen) + ntohl(header->tpHeaderLen) + ntohl(header->kernelLen) + ntohl(header->romFsLen) + ntohl(header->jffs2FsLen); #else size = info->size - info->uhTagLength; #endif addrOffset = ntohl(header->bootloaderOffset); ret = executeUpgrade(addrOffset, base, size); if (ret < 0) { printf("%s failed\n", __func__); return ret; } #if 0 /* erase user config */ addrOffset = ntohl(header->ucOffset); ret = eraseFlash(addrOffset, ntohl(header->ucLen)); #endif return ret; } #ifdef UNIFY_FIRMWARE /****************************************************************************** * FUNCTION : checkFirmwareIsp() * AUTHOR : He Shufan ([email protected]) * DESCRIPTION : check isp content and if they are newer or not. * INPUT : BLOCK_HEADER, pointer to block_handler of this function * * OUTPUT : N/A * RETURN : ret code * OTHERS : ******************************************************************************/ static int checkFirmwareIsp(BLOCK_HEADER* hdr, void* thisHandler) { int ret = 0; int i = 0; int blockNum = 0; char md5Tmp[MD5SUM_LEN] = {0}; char devName[EXT_FW_DEVNAME_LEN + 1] = {0}; char* base = (char*)hdr; EXT_FW_HEADER* iHdr = NULL; EXT_FW_BLOCK_HANDLER* pointer = thisHandler; if (NULL == hdr || NULL == thisHandler) { ret = ERR_GENERIC; goto out; } blockNum = ntohl(hdr->num); base += sizeof(BLOCK_HEADER); /* 由device_model和hw_version通过"_"拼凑而成 */ snprintf(devName, EXT_FW_DEVNAME_LEN, "%s_%s", localInfo.device_model, localInfo.hw_version); DBG("Local devName: %s", devName); for (i = 0; i < blockNum; i++) { if (CONTENT_TYPE_ISP_CONFIG == ntohl(hdr->info[i].type)) { iHdr = (EXT_FW_HEADER *)base; DBG("iHdr->devName = %s", iHdr->devName); if (0 == memcmp(iHdr->devName, devName, strlen(devName))) { pointer->block = iHdr; DBG("isp: device name supported"); break; } } base += ntohl(hdr->info[i].length); } if (i == blockNum) { DBG("isp: device name not supported"); ret = ERR_SLP_BAD_EXT_FW; goto out; } calcMd5((char*)iHdr + sizeof(EXT_FW_HEADER), ntohl(iHdr->length), md5Tmp); ret = memcmp(iHdr->md5, md5Tmp, MD5SUM_LEN); if (ret) { DBG("Invalid isp data in firmware"); goto out; } out: return ret; } /****************************************************************************** * FUNCTION : upgradeFirmwareIsp() * AUTHOR : He Shufan ([email protected]) * DESCRIPTION : upgrade isp in flash * INPUT : EXT_FW_HEADER * * OUTPUT : N/A * RETURN : ret code * OTHERS : ******************************************************************************/ static int upgradeFirmwareIsp(EXT_FW_HEADER* block) { int ret = 0; char ispBuf[RADIO_LEN] = {0}; uint32_t addrOffset = 0; uint32_t size = 0; if (NULL == block) { return ERR_GENERIC; } addrOffset = RADIO_OFFSET; size = ntohl(block->length) + sizeof(EXT_FW_HEADER); memset(ispBuf, 0xff, RADIO_LEN); memcpy(ispBuf, (void *)block, size); ret = eraseFlash(addrOffset, RADIO_LEN); if (ret < 0) { DBG("erase radio flash failed!"); return ret; } ret = writeFlash(addrOffset, ispBuf, RADIO_LEN); if (ret) { return ret; } DBG("upgrade isp done"); return ERR_NONE; } static int checkExtFirmware(FW_INFO* info) { int i = 0; int ret = 0; unsigned short handlerFound = 0; unsigned short upContents = 0; BLOCK_HEADER* blockHdr = NULL; UPGRADE_HEADER* uHeader = NULL; TP_HEADER *header = NULL; if (NULL == info) { return ERR_GENERIC; } uHeader = (UPGRADE_HEADER*)info->buf; header = (TP_HEADER*)(info->buf + info->uhTagLength + BOOTLOADER_LEN); upContents = ntohs(uHeader->contentTypes); /* 新nvmp平台去除了jffs2FsLen的部分,因此将header->jffs2FsLen去除 */ blockHdr = (BLOCK_HEADER*)((char*)header + ntohl(header->jffs2FsOffset - header->tpHeaderOffset/* + header->jffs2FsLen*/)); if (0 != memcmp(blockHdrMagicNumber, blockHdr->magicNumber, BLOCK_MAGIC_NUMBER_LEN)) { DBG("invalid ext_fw block header"); return ERR_SLP_BAD_EXT_FW; } for (i = 0; i < sizeof(blockHdrTbl) / sizeof(EXT_FW_BLOCK_HANDLER); i++) { if (0 != blockHdrTbl[i].type & upContents) { handlerFound |= blockHdrTbl[i].type; ret = blockHdrTbl[i].checkExtFw(blockHdr, &blockHdrTbl[i]); if (ret) { DBG("check ext_fw failed, type:0x%x", blockHdrTbl[i].type); return ERR_SLP_BAD_EXT_FW; } } } if ((upContents & ~(PARTS_UP_BOOT)) != handlerFound) { return ERR_SLP_BAD_EXT_FW; } DBG("ext_fw check ok."); return ERR_NONE; } static int upgradeExtFirmware() { int i = 0; int ret = 0; for (i = 0; i < sizeof(blockHdrTbl) / sizeof(EXT_FW_BLOCK_HANDLER); i++) { if (blockHdrTbl[i].bNeedUpgrade) { ret = blockHdrTbl[i].upgradeExtFw(blockHdrTbl[i].block); if (ret) { DBG("upgrade ext_fw failed, type:0x%x", blockHdrTbl[i].type); return ret; } } } DBG("ext_fw upgrade ok."); return ERR_NONE; } #endif /* * Function Name: validateLocalFirmware * Author: CaiBin * Date: 2014-11-07 * Description: Check if local firmware is valid. * Validate partition offsets,lengths and CRC's in TP Header. * Note: According to the newly designed flash layout and upload firmware * layout. Only uboot partition, TP Header partition, kernel and fs partitions * is validated. * Parameter: * header: Points to the TP Header partition of the firmware image to validate. * return: * 0: Succeeded; * ERR_INVALID_TP_HEADER: Firmware has not all partitions. * ERR_PARTITION_VALIDATION_FAILED: Partition CRC verification failed. */ int validateLocalFirmware(void) { volatile int ret = 0; TP_HEADER* header = (TP_HEADER*)(UIP_FLASH_BASE + TP_HEADER_OFFSET); uint32_t partitions = PARTITION_TYPE_BOOTLOADER | PARTITION_TYPE_KERNEL; /* * Note: As TP Header may be upgraded with crc's of these partitions changed, but the * content of these partitions is never changed during upgrading. Normal check may result error. */ #ifdef WEBFAILSAFE_DO_FULL_LOCAL_VALIDATION partitions |= (PARTITION_TYPE_FACTORY_INFO | PARTITION_TYPE_RADIO_DATA); #endif #ifdef WEBFAILSAFE_LOCAL_VALIDATION_IN_RAM //copy flash image to RAM. DBG("copying flash to 0x%x", WEBFAILSAFE_UPLOAD_RAM_ADDRESS); ret = readFlash(0, WEBFAILSAFE_UPLOAD_RAM_ADDRESS, UIP_FLASH_SIZE); if (ret < 0) { ERR("reading flash to RAM failed."); return ret; } header = (TP_HEADER*)(WEBFAILSAFE_UPLOAD_RAM_ADDRESS + TP_HEADER_OFFSET); #endif DBG_UNIT("validate local firmware...\nTP Header at %p", header); #ifdef UIP_CACHE_OPERATION uip_cache_enable(); #endif ret = validatePartitions(header, partitions); #ifdef UIP_CACHE_OPERATION uip_cache_disable(); #endif return ret; } /* * Function Name: upgrade_init * Author: CaiBin * Date: 2014-11-07 * Description: Initiate local data and server page info. * Parameter: * N/A * return: * 0: Succeeded; * ERR_HWID_NOT_FOUND: current hardware id not found. * ERR_FWID_NOT_FOUND: allowed firmware id not found. * ERR_READ_FLASH: Read command execution error. * ERR_BAD_ADDRESS: Invalid address values passed. * ERR_GENERIC: Web content error. */ int upgrade_init() { int ret = 0; //init local IDs. ret = localInfoInit(); if (ret < 0) { DBG("local info init failed, exit"); return ret; } return 0; } /* * Function Name: do_http_check * Author: CaiBin * Date: 2014-11-07 * Description: Firmware check. * Parameter: * size: Upgrading firmware size. * return: * 0: Succeeded; * ERR_INCORRECT_FILE_SIZE: File size is incorrect. * ERR_RSA_CHECK_FAIL: Signature is incorrect. * ERR_HWID_NOT_SUPPORTED: HwID is not supported. * ERR_PARTITION_TYPE_NOT_SUPPORTED: Firmware has not all partitions. * ERR_WRITE_FLASH: Write command execution error. * ERR_READ_FLASH: Read command execution error. * ERR_BAD_ADDRESS: Invalid address values passed. */ int do_http_check(const ulong size) { volatile int ret = 0; fw_info.buf = (unsigned char*)WEBFAILSAFE_UPLOAD_RAM_ADDRESS; fw_info.size = size; fw_info.uhTagLength = 0; #ifdef UIP_CACHE_OPERATION uip_cache_enable(); #endif //check firmware size, RSA signature, HwID, content type, and validate partitions. ret = checkFirmware(&fw_info); #ifdef UNIFY_FIRMWARE if (ret < 0) { goto goon; } ret = checkExtFirmware(&fw_info); #endif goon: #ifdef UIP_CACHE_OPERATION uip_cache_disable(); #endif if (ret < 0) { DBG("check firmware failed, exit"); return ret; } return ret; } /* * Function Name: do_http_upgrade * Author: CaiBin * Date: 2014-11-07 * Description: Firmware upgrade. * Parameter: * size: Upgrading firmware size. * return: * 0: Succeeded; * ERR_WRITE_FLASH: Write command execution error. * ERR_READ_FLASH: Read command execution error. * ERR_ERASE_FLASH: Erase command execution error. * ERR_BAD_ADDRESS: Invalid address values passed. */ int do_http_upgrade(const ulong size) { int ret = 0; //write upgrade data into flash. ret = upgradeFirmware(&fw_info); if (ret < 0) { DBG("upgrade firmware failed, exit"); return ret; } #ifdef UNIFY_FIRMWARE ret = upgradeExtFirmware(); #endif return ret; } // info about current progress of failsafe mode int do_http_progress(const int state){ unsigned char i = 0; /* toggle LED's here */ switch(state){ case WEBFAILSAFE_PROGRESS_START: /* turn on sys led. */ all_leds_on(1); printf("HTTP server is ready!\n\n"); break; case WEBFAILSAFE_PROGRESS_TIMEOUT: //printf("Waiting for request...\n"); break; case WEBFAILSAFE_PROGRESS_UPLOAD_READY: all_leds_on(0); printf("HTTP upload is done! Upgrading...\n"); break; case WEBFAILSAFE_PROGRESS_UPGRADE_READY: all_leds_on(0); printf("HTTP ugrade is done! Rebooting...\n\n"); break; case WEBFAILSAFE_PROGRESS_UPGRADE_ABORTED: all_leds_on(0); printf("\nWeb failsafe mode aborted!\n\n"); break; case WEBFAILSAFE_PROGRESS_UPGRADE_FAILED: all_leds_on(0); printf("## Error: HTTP ugrade failed!\n\n"); // wait 1 sec milisecdelay(1000); break; } return(0); }解析一下

filetype

06-10 11:26:30.387266 4451 4451 I [ 1054.679861][schedu][0x4bc97218d][03:26:30.379052] qca6750: [4451:I:PE] Assoc req TX: vdev 0 to 00:03:7f:**:**:98 seq num 2099 06-10 11:26:30.392089 4451 4451 I [ 1054.684684][schedu][0x4bc988b50][03:26:30.383875] qca6750: [4451:I:PE] Assoc req TX: success (0) 06-10 11:26:30.407552 4451 4451 I [ 1054.700147][schedu][0x4bc9d1304][03:26:30.399338] qca6750: [4451:I:PE] Assoc rsp RX: subtype 0 vdev 0 sys role 2 lim state 10 rssi -18 from 00:03:7f:**:**:98 06-10 11:26:30.407611 4451 4451 E [ 1054.700206][schedu][0x4bc9d1788][03:26:30.399398] qca6750: [4451:E:PE] wlan_parse_ftie_sha384: FT IE not present 06-10 11:26:30.407806 4451 4451 E [ 1054.700401][schedu][0x4bc9d2613][03:26:30.399592] qca6750: [4451:E:PE] sir_convert_assoc_resp_frame2_struct: FT IE parsing failed status:0 06-10 11:26:30.407998 4451 4451 E [ 1054.700593][schedu][0x4bc9d3482][03:26:30.399784] qca6750: [4451:E:PE] lim_process_assoc_rsp_frame: received Re/AssocRsp frame failure code: 43 06-10 11:26:30.408038 4451 4451 E [ 1054.700633][schedu][0x4bc9d378f][03:26:30.399825] qca6750: [4451:E:PE] lim_process_assoc_rsp_frame: Assoc Rejected by the peer mlmestate: 10 sessionid: 0 Reason: 516 MACADDR:00:03:7f:**:**:98 06-10 11:26:30.408067 4451 4451 E [ 1054.700662][schedu][0x4bc9d39ba][03:26:30.399854] qca6750: [4451:E:PE] lim_process_mlm_assoc_cnf: SessionId:0 Association failure resultCode: 516 limSmeState:5 06-10 11:26:30.408523 4451 4451 I [ 1054.701118][schedu][0x4bc9d5bf9][03:26:30.400311] qca6750: [4451:I:mlme] mlme_set_chan_switch_in_progress: Set chan_switch_in_progress: 0 vdev 0 06-10 11:26:30.414371 0 0 E [ 1054.706966][ C2] [soft_i][0x4bc9f1282][03: 26:30.406158] qca6750: [0:E:REGULATORY] reg_process_ch_avoid_event: skipping LTE Coex unsafe channel change 06-10 11:26:30.414395 0 0 E [ 1054.706990][ C2] [soft_i][0x4bc9f1463][03: 26:30.406183] qca6750: [0:E:TIF] tgt_reg_ch_avoid_event_handler: Failed to process CH avoid event 06-10 11:26:30.417841 4451 4451 E [ 1054.710436][schedu][0x4bca016c5][03:26:30.409628] qca6750: [4451:E:CMN_MLME] mlme_sr_update: Spatial Reuse disabled for vdev_id: 0 06-10 11:26:30.418764 4451 4451 I [ 1054.711359][schedu][0x4bca05bfd][03:26:30.410551] qca6750: [4451:I:OSIF] wlan0(vdevid-0): fc:d2:02:**:**:e1 Connect with 00:03:7f:**:**:98 "Wi-Fi_200" is FAILURE, cmid 0xc00000e reason 9 status 43 06-10 11:26:30.420550 11720 11720 E [ 1054.713145][wpa_su][0x4bca0e200][03:26:30.412338] qca6750: [11720:E:OSIF] wlan_cfg80211_mc_cp_stats_get_station_stats: peer is null 06-10 11:26:30.420575 11720 11720 E [ 1054.713170][wpa_su][0x4bca0e3ff][03:26:30.412364] qca6750: [11720:E:HDD] wlan_hdd_get_station_stats: Invalid stats 06-10 11:26:30.420587 11720 11720 E [ 1054.713182][wpa_su][0x4bca0e4eb][03:26:30.412376] qca6750: [11720:E:HDD] hdd_get_station_info_ex: wlan_hdd_get_station_stats fail

filetype

1343 int ddr_mem_test(ulong dram_base, ulong test_len, ulong is_loop) 1344 { 1345 volatile ulong loop = is_loop; 1346 ul length; 1347 int regval; 1348 1349 sprd_ddr_memtest_prepare(); 1350 1351 length = sizeof(tests)/sizeof(struct sprd_memtest_list); 1352 for (regval=0; regval < length; regval++) { 1353 sprd_ddr_memtest_progress_start(tests[regval].name, regval); 1354 if (tests[regval].sprd_memtest_func((ulv*)dram_base, test_len) != MEMTEST_SUCCESS) { 1355 dprintf(INFO,"memtest failed in: %s\n", tests[regval].name); 1356 lcd_printf("memtest failed in: %s\n", tests[regval].name); 1357 while (loop); 1358 return -1; 1359 } 1360 sprd_ddr_memtest_progress_end(); 1361 } 1362 1363 return 0; 1364 1365 } void fastboot_mode(void) { int ret; char result_flag; char done_flag; FTL_Savepoint_Private(PHASE_FASTBOOT_MODE); dprintf(ALWAYS, "enter [%s]\n",__func__); stop_watchdog(); g_env_bootmode = "fastboot"; write_log(); #ifdef CONFIG_SPLASH_SCREEN logo_display(LOGO_NORMAL_POWER, BACKLIGHT_ON, LCD_ON); vibrator_hw_init(); set_vibrator(1); fastboot_lcd_printf(); mdelay(400); set_vibrator(0); #endif if (( common_raw_read("miscdata", 1, MEMTEST_OFFSET_START, &flag_value) == 0) && (flag_value == DDR_MEMTEST_START_CHAR)) { lcd_printf("\n[DDR memtest] ddr memtest start!\n"); ret = ddr_mem_test(0xd0000000,0x80000000,0); char result_flag = (ret == 0) ? MEMTEST_RESULT_SUCCESS : MEMTEST_RESULT_FAIL; char done_flag = MEMTEST_TRIGGER_DONE; if(ret != 0) { dprintf(INFO,"[DDR memtest] fastboot mode ddr memtest fail!\n"); common_raw_write("miscdata", 1, 0, MEMTEST_OFFSET_START, DDR_MEMTEST_COMPLETE_FLAG); common_raw_write("miscdata", 1, 0, MEMTEST_OFFSET_RESULT, DDR_MEMTEST_FAIL_FLAG); } else { dprintf(INFO,"[DDR memtest] fastboot mode ddr memtest success!\n"); common_raw_write("miscdata", 1, 0, MEMTEST_OFFSET_START, DDR_MEMTEST_COMPLETE_FLAG); common_raw_write("miscdata", 1, 0, MEMTEST_OFFSET_RESULT, DDR_MEMTEST_PASS_FLAG); } reboot_devices(CMD_NORMAL_MODE); } //MMU_DisableIDCM(); #if (defined CONFIG_X86) && (defined CONFIG_MOBILEVISOR) && (defined CONFIG_SPRD_SOC_SP9853I) tos_start_notify(); #endif #ifdef SPRD_SECBOOT if(!dump_backtrace_once){ //if dump enter fastboot, cannot get lockstatus if (get_lock_status() == VBOOT_STATUS_UNLOCK){ debugf("INFO: LOCK FLAG IS : UNLOCK!!!\n"); lcd_printf("\n INFO: LOCK FLAG IS : UNLOCK!!!\n"); } get_secboot_base_from_dt(); } #endif do_fastboot(); } /* get mode from miscdata */ boot_mode_enum_type get_mode_from_miscdata_boot_flag(void) { char flag_value = 0; dprintf(INFO,"==== in [%s] \n", __func__); #if defined(CONFIG_CUSTOMER_PHONE) && defined(CONFIG_AUTOBOOT) extern unsigned reboot_reg; if ((reboot_reg & 0xFF) == HWRST_STATUS_AUTODLOADER) { dprintf(INFO,"%s:rst_mode is autodloader\n", __func__); return CMD_AUTODLOADER_REBOOT; } #elif defined CONFIG_AUTOBOOT dprintf(INFO," AUTOBOOT ENABLE! \n"); return CMD_NORMAL_MODE; #endif boot_mode_enum_type first_mode = read_boot_flag(); if (first_mode != CMD_UNDEFINED_MODE) { bootcause_cmdline="Detect the firsrt_mode flag in the miscdata partition"; dprintf(INFO,"get mode from firstmode field: %s\n", g_mode_str[first_mode]); return first_mode; } if (( common_raw_read("miscdata", 1, MEMTEST_TRIGGER_OFFSET, &flag_value) == 0) && (flag_value == MEMTEST_TRIGGER_START)){ dprintf(INFO, "[DDR memtest] enter fastboot mode\n"); fastboot_mode(); } return CMD_UNDEFINED_MODE; } int common_raw_write(const char *part_name, uint64_t size, uint64_t updsize, uint64_t offset, char *buf) 589 { 590 int dev_id = 0; 591 char *ifname; 592 uint64_t part_start = 0; 593 disk_partition_t part_info; 594 block_dev_desc_t *dev_desc; 595 uint64_t total_part_size = 0; 596 int ret = 0; 597 598 SPRD_BLOCK_LOCK(state); 599 600 ifname = block_dev_get_name(); 601 602 if (0 == strcmp(part_name, "splloader")) { 603 dev_id = get_devnum_hwpart(ifname, BOOT_PART1); 604 dev_desc = get_dev_hwpart(ifname, dev_id, BOOT_PART1); 605 } else if(0 == strcmp(part_name, "splloader_bak")) { 606 dev_id = get_devnum_hwpart(ifname, BOOT_PART2); 607 dev_desc = get_dev_hwpart(ifname, dev_id, BOOT_PART2); 608 } else if(0 == strcmp(part_name, "uboot")) { 609 dev_id = get_devnum_hwpart(ifname, USER_PART); 610 dev_desc = get_dev_hwpart(ifname, dev_id, USER_PART); 611 if (NULL == dev_desc) { 612 errorf("invalid dev_desc!\n"); 613 SPRD_BLOCK_UNLOCK(state); 614 return -ENODEV; 615 } 616 ret = get_partition_info_by_name(dev_desc, part_name, &part_info); 617 if (-1 == ret) { 618 ret = 0; 619 dev_id = get_devnum_hwpart(ifname, BOOT_PART2); 620 dev_desc = get_dev_hwpart(ifname, dev_id, BOOT_PART2); 621 } else { 622 part_start = (uint64_t)part_info.blksz * (uint64_t)part_info.start_blk; 623 total_part_size = (uint64_t)part_info.blksz * (uint64_t)part_info.blk_cnt; 624 if ((size > total_part_size) 625 || (offset > total_part_size) 626 || (size + offset > total_part_size)) { 627 errorf("uboot write size(0x%llx + 0x%llx) overflow the total partition size(0x%llx)\n", size, offset, total_part_size); 628 goto error; 629 } 630 } 631 } else { 632 dev_id = get_devnum_hwpart(ifname, USER_PART); 633 dev_desc = get_dev_hwpart(ifname, dev_id, USER_PART); 634 if (NULL == dev_desc) { 635 errorf("invalid dev_desc!\n"); 636 SPRD_BLOCK_UNLOCK(state); 637 return -ENODEV; 638 } 639 ret = get_partition_info_by_name(dev_desc, part_name, &part_info); 640 part_start = (uint64_t)part_info.blksz * (uint64_t)part_info.start_blk; 641 total_part_size = (uint64_t)part_info.blksz * (uint64_t)part_info.blk_cnt; 642 if ((size > total_part_size) 643 || (offset > total_part_size) 644 || (size + offset > total_part_size)) { 645 errorf("write size(0x%llx + 0x%llx) overflow the total partition size(0x%llx)\n", size, offset, total_part_size); 646 goto error; 647 } 648 } 649 650 if (-1 == ret || NULL == dev_desc) 651 goto error; 652 offset += part_start; 653 654 ret = block_dev_write(dev_desc, size, offset, buf); 655 goto end; 656 657 error: 658 ret = -1; 659 end: 660 SPRD_BLOCK_UNLOCK(state); 661 662 return ret; 663 } int common_raw_read(const char *part_name, uint64_t size, uint64_t offset, char *buf) 402 { 403 int dev_id = 0; 404 char *ifname; 405 lbaint_t part_start = 0; 406 disk_partition_t part_info; 407 block_dev_desc_t *dev_desc; 408 uint64_t total_part_size = 0; 409 uint64_t total_part_read_size = 0; 410 int ret = 0; 411 char part_name_temp[MAX_PARTITION_NAME_SIZE]; 412 413 #if WITH_SMP 414 if (bootimg_load_flag) 415 ddr_boot_img_addr = ddr_bootimg; 416 if (vendorbootimg_load_flag) 417 vendorboot_ddr_img_addr = ddr_vendorbootimg; 418 #endif 419 #ifdef CONFIG_ANDROID_AB 420 if (ddr_boot_img_addr && !strncmp(part_name, "boot_", 5)) 421 #else 422 if (ddr_boot_img_addr && ((!strcmp(part_name, "boot"))||(!strcmp(part_name, "recovery")))) 423 #endif 424 { 425 debugf("the second boot.img and recovery.img load is in DDR during secboot mode\n"); 426 offset += ddr_boot_img_addr; 427 memcpy(buf, (char *)offset, size); 428 flush_cache(buf, size); 429 return 0; 430 } 431 #ifdef CONFIG_ANDROID_AB 432 if (vendorboot_ddr_img_addr && !strncmp(part_name, "vendor_boot_", 12)) 433 #else 434 if (vendorboot_ddr_img_addr && (!strcmp(part_name, "vendor_boot"))) 435 #endif 436 { 437 debugf("the second vendor_boot.img load is in DDR during secboot mode\n"); 438 offset += vendorboot_ddr_img_addr; 439 memcpy(buf, offset, size); 440 flush_cache(buf, size); 441 return 0; 442 } 443 444 #ifdef KCE_ENCRYPT_FLAG 445 #ifdef CONFIG_ANDROID_AB 446 if (ddr_dtbo_img_addr && !strncmp(part_name, "dtbo_", 5)) 447 #else 448 if (ddr_dtbo_img_addr && (!strcmp(part_name, "dtbo"))) 449 #endif 450 { 451 debugf("the second dtbo.img load is in DDR during secboot mode\n"); 452 offset += ddr_dtbo_img_addr; 453 memcpy(buf, offset, size); 454 return 0; 455 } 456 #endif //KCE_ENCRYPT_FLAG 457 ifname = block_dev_get_name(); 458 459 if(strstr(part_name, "_size") != NULL) { 460 memcpy(part_name_temp, part_name, strlen(part_name)-5); 461 ret = get_img_partition_size(part_name_temp, &total_part_read_size); 462 debugf("partition %s total size: 0x%llx, block number: 0x%llx\n", 463 part_name_temp, total_part_read_size, total_part_read_size/512); 464 snprintf(buf, 0x80, "partition %s total size: 0x%llx, block number: 0x%llx\n", 465 part_name_temp, total_part_read_size, total_part_read_size/512); 466 467 return ret; 468 } 469 470 SPRD_BLOCK_LOCK(state); 471 if(strcmp(part_name, "user_partition") == 0) { 472 dev_id = get_devnum_hwpart(ifname, USER_PART); 473 dev_desc = get_dev_hwpart(ifname, dev_id, USER_PART); 474 part_start = 0; 475 total_part_size = get_devsize_hwpart(ifname, USER_PART); 476 if ((size > total_part_size) 477 || (offset > total_part_size) 478 || (size + offset > total_part_size)) { 479 errorf("read user partition size(0x%llx + 0x%llx) overflow the total partition size(0x%llx)\n", 480 size, offset, total_part_size); 481 ret = -1; 482 } 483 } else if (0 == strcmp(part_name, "splloader")) { 484 dev_id = get_devnum_hwpart(ifname, BOOT_PART1); 485 dev_desc = get_dev_hwpart(ifname, dev_id, BOOT_PART1); 486 } else if (0 == strcmp(part_name, "splloader_bak")) { 487 dev_id = get_devnum_hwpart(ifname, BOOT_PART2); 488 dev_desc = get_dev_hwpart(ifname, dev_id, BOOT_PART2); 489 } else if (0 == strcmp(part_name, "uboot")) { 490 dev_id = get_devnum_hwpart(ifname, USER_PART); 491 dev_desc = get_dev_hwpart(ifname, dev_id, USER_PART); 492 if (NULL == dev_desc) { 493 errorf("invalid dev_desc!\n"); 494 SPRD_BLOCK_UNLOCK(state); 495 return -ENODEV; 496 } 497 ret = get_partition_info_by_name(dev_desc, part_name, &part_info); 498 if (-1 == ret) { 499 ret = 0; 500 dev_id = get_devnum_hwpart(ifname, BOOT_PART2); 501 dev_desc = get_dev_hwpart(ifname, dev_id, BOOT_PART2); 502 } else { 503 part_start = (uint64_t)part_info.start_blk * (uint64_t)part_info.blksz; 504 total_part_size = (uint64_t)part_info.blksz * (uint64_t)part_info.blk_cnt; 505 if ((size > total_part_size) 506 || (offset > total_part_size) 507 || (size + offset > total_part_size)) { 508 errorf("uboot read size(0x%llx + 0x%llx) overflow the total partition size(0x%llx)\n", size, offset, total_part_size); 509 ret = -1; 510 } 511 } 512 } else if (0 != strstr(part_name, "fixnv")) { 513 dev_id = get_devnum_hwpart(ifname, USER_PART); 514 dev_desc = get_dev_hwpart(ifname, dev_id, USER_PART); 515 if (NULL == dev_desc) { 516 errorf("invalid dev_desc!\n"); 517 SPRD_BLOCK_UNLOCK(state); 518 return -ENODEV; 519 } 520 ret = get_partition_info_by_name(dev_desc, part_name, &part_info); 521 if (-1 == ret) { 522 ret = 0; 523 memset(part_name_temp, 0, MAX_PARTITION_NAME_SIZE); 524 if (0 != strstr(part_name, "_a")) { 525 memcpy(part_name_temp, part_name, strlen(part_name)-2); 526 527 }else { 528 snprintf(part_name_temp, MAX_PARTITION_NAME_SIZE, "%s%s", part_name, "_a"); 529 } 530 debugf("try to adapt ab and not ab fix partition name: %s\n", part_name_temp); 531 ret = get_partition_info_by_name(dev_desc, (const char *)part_name_temp, &part_info); 532 part_start = (uint64_t)part_info.start_blk * (uint64_t)part_info.blksz; 533 total_part_size = (uint64_t)part_info.blksz * (uint64_t)part_info.blk_cnt; 534 if ((size > total_part_size) 535 || (offset > total_part_size) 536 || (size + offset > total_part_size)) { 537 errorf("uboot fixnv read: size(0x%llx + 0x%llx) overflow the total partition size(0x%llx)\n", size, offset, total_part_size); 538 ret = -1; 539 } 540 } else { 541 part_start = (uint64_t)part_info.start_blk * (uint64_t)part_info.blksz; 542 total_part_size = (uint64_t)part_info.blksz * (uint64_t)part_info.blk_cnt; 543 if ((size > total_part_size) 544 || (offset > total_part_size) 545 || (size + offset > total_part_size)) { 546 errorf("uboot read size(0x%llx + 0x%llx) overflow the total partition size(0x%llx)\n", size, offset, total_part_size); 547 ret = -1; 548 } 549 } 550 } else { 551 dev_id = get_devnum_hwpart(ifname, USER_PART); 552 dev_desc = get_dev_hwpart(ifname, dev_id, USER_PART); 553 if (NULL == dev_desc) { 554 errorf("invalid dev_desc!\n"); 555 SPRD_BLOCK_UNLOCK(state); 556 return -ENODEV; 557 } 558 ret = get_partition_info_by_name(dev_desc, part_name, &part_info); 559 part_start = (uint64_t)part_info.start_blk * (uint64_t)part_info.blksz; 560 total_part_size = (uint64_t)part_info.blksz * (uint64_t)part_info.blk_cnt; 561 if ((size > total_part_size) 562 || (offset > total_part_size) 563 || (size + offset > total_part_size)) { 564 errorf("read size(0x%llx + 0x%llx) overflow the total partition size(0x%llx)\n", size, offset, total_part_size); 565 ret = -1; 566 } 567 } 568 569 if (-1 == ret || NULL == dev_desc) 570 goto error; 571 572 if (0 == size) 573 size = total_part_size; 574 575 offset += part_start; 576 577 ret = block_dev_read(dev_desc, size, offset, buf); 578 goto end; 579 580 error: 581 ret = -1; 582 end: 583 SPRD_BLOCK_UNLOCK(state); 584 585 return ret; 586 } 【情况说明】 我们已经上传了我们实现的demo在CR, 偏移已经对齐了。这个是长期且重要的需求,以后展瑞平台项目R项目都会包含这个测试项,帮忙提供一下正式patch,主要涉及 779*1024 及 780*1024的偏移。 offset - 779*1024: 开始测试,写入ASCII码:---Android写入(ASCII 0x31) 测试完成,写入ASCII码:---BSP写入 (ASCII 0x32) offset - 780*1024: 测试失败写入ASCII码:--BSP写入 (ASCII 0x31) 测试成功写入ASCII码:---BSP写入 (ASCII 0x32) 【需求】 1. boot_mode.c 中 fast_mode函数里面希望增加个判断条件,如 779*1024 位置读取是 ASSIC 码49时,才运行,以保证正常进入fast boot 模式不会 有memtest的问题 2.common_raw_write("miscdata", 1, 0, (uint64_t)(779*1024), "2"); 中 “2” 这种写法是灾难级的,帮忙用宏控的方式控制写入的值。 3. int common_raw_write(const char *part_name, uint64_t size, uint64_t updsize, uint64_t offset, char *buf), char *buf 接受的值不会传错 5.代码汇总输出 6.进入memtest后,779*1024先设置为0,避免中途中断后下次必进入memtest

filetype

#include <Wire.h> #include "MAX30105.h" #include "spo2_algorithm.h" #include <U8g2lib.h> // 内存优化配置 #define BUFFER_SIZE 25 // 平衡精度与内存 #define WAVE_POINTS 24 // 波形点数量优化 #define REFRESH_RATE 1000 // 显示刷新率(ms) // PROGMEM存储常量字符串 const char strSpO2[] PROGMEM = "SpO2:"; const char strBPM[] PROGMEM = "BPM:"; const char strError[] PROGMEM = "Sensor Error!"; const char strCheck[] PROGMEM = "Check Sensor"; const char strInit[] PROGMEM = "Initializing..."; const char strTitle[] PROGMEM = "Vital Signs"; // 硬件适配层 U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0); MAX30105 particleSensor; // 内存优化缓冲区 uint16_t irBuffer[BUFFER_SIZE]; uint16_t redBuffer[BUFFER_SIZE]; uint8_t waveY[WAVE_POINTS]; // 波形Y坐标缓存 // 系统状态变量 byte waveIndex = 0; unsigned long lastUpdate = 0; bool sensorError = false; void setup() { Wire.begin(); // OLED初始化(兼容不同地址) u8g2.setI2CAddress(0x3C << 1); if (!u8g2.begin()) { // 尝试备用地址 u8g2.setI2CAddress(0x3D << 1); if (!u8g2.begin()) sensorError = true; } if (!sensorError) { u8g2.setContrast(150); u8g2.setFont(u8g2_font_6x10_tr); displayStartupScreen(); } // 传感器初始化(兼容不同I2C速度) if (!particleSensor.begin(Wire, I2C_SPEED_STANDARD)) { if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) { sensorError = true; } } if (!sensorError) { // 动态配置参数(根据实际需求调整) byte sampleAvg = 4; // 采样平均 byte ledMode = 2; // 红光+红外 int sampleRate = 100; // Hz int pulseWidth = 411; // us int adcRange = 4096; // 12位 particleSensor.setup(sampleRate, sampleAvg, ledMode, pulseWidth, adcRange); // 预热传感器(带进度显示) for (byte i = 0; i < 15; i++) { particleSensor.check(); displayProgress(i * 100 / 15); delay(30); } } } void displayStartupScreen() { u8g2.firstPage(); do { u8g2.drawStr(20, 20, "Pulse Oximeter"); u8g2.drawStr_P(15, 40, strInit); u8g2.drawFrame(0, 0, 128, 64); } while (u8g2.nextPage()); } void displayProgress(byte percent) { u8g2.firstPage(); do { u8g2.drawStr(20, 20, "Calibrating"); u8g2.drawFrame(10, 35, 100, 10); u8g2.drawBox(12, 37, percent, 6); } while (u8g2.nextPage()); } void displayError() { u8g2.firstPage(); do { u8g2.drawStr_P(10, 30, strError); u8g2.drawStr_P(10, 50, strCheck); } while (u8g2.nextPage()); } void loop() { if (sensorError) { displayError(); delay(2000); return; } // 高效数据采集(带超时机制) unsigned long start = millis(); for (byte i = 0; i < BUFFER_SIZE; i++) { while (!particleSensor.available()) { particleSensor.check(); if (millis() - start > 2000) { sensorError = true; return; } delay(1); } redBuffer[i] = particleSensor.getRed(); irBuffer[i] = particleSensor.getIR(); particleSensor.nextSample(); // 波形数据更新(每2个样本) if (i % 2 == 0) { // 动态映射范围(适应不同信号强度) uint16_t signal = irBuffer[i] % 5000; waveY[waveIndex] = map(signal, 500, 4500, 60, 20); waveIndex = (waveIndex + 1) % WAVE_POINTS; } } // 血氧心率计算 int32_t spo2, heartRate; int8_t validSPO2, validHeartRate; maxim_heart_rate_and_oxygen_saturation( irBuffer, BUFFER_SIZE, redBuffer, &spo2, &validSPO2, &heartRate, &validHeartRate ); // 按设定频率更新显示 if (millis() - lastUpdate > REFRESH_RATE) { displayData(spo2, validSPO2, heartRate, validHeartRate); lastUpdate = millis(); } } void displayData(int32_t spo2, int8_t validSPO2, int32_t heartRate, int8_t validHeartRate) { char buffer[10]; u8g2.firstPage(); do { // 标题(使用PROGMEM) u8g2.drawStr_P(40, 10, strTitle); u8g2.drawHLine(0, 12, 128); // 血氧显示 u8g2.setFont(u8g2_font_7x14_tr); u8g2.setCursor(10, 35); u8g2.print(strSpO2); if (validSPO2) { snprintf_P(buffer, sizeof(buffer), PSTR("%d%%"), spo2); u8g2.print(buffer); } else { u8g2.print("---"); } // 心率显示 u8g2.setCursor(10, 55); u8g2.print(strBPM); if (validHeartRate) { snprintf_P(buffer, sizeof(buffer), PSTR("%d"), heartRate); u8g2.print(buffer); } else { u8g2.print("---"); } // 波形显示(内存优化) u8g2.drawHLine(0, 63, 128); for (byte i = 0; i < WAVE_POINTS; i++) { byte pos = (waveIndex + i) % WAVE_POINTS; u8g2.drawPixel(i * (128/WAVE_POINTS), 63 - waveY[pos]); } } while (u8g2.nextPage()); } D:\徐景川作业相关\传感器实验\智能传感与检测技术 实习\sketch_jul10a_copy_20250714175331\sketch_jul10a_copy_20250714175331.ino: In function 'void displayStartupScreen()': D:\徐景川作业相关\传感器实验\智能传感与检测技术 实习\sketch_jul10a_copy_20250714175331\sketch_jul10a_copy_20250714175331.ino:80:10: error: 'class U8G2_SH1106_128X64_NONAME_F_HW_I2C' has no member named 'drawStr_P'; did you mean 'drawStr'? D:\徐景川作业相关\传感器实验\智能传感与检测技术 实习\sketch_jul10a_copy_20250714175331\sketch_jul10a_copy_20250714175331.ino: In function 'void displayError()': D:\徐景川作业相关\传感器实验\智能传感与检测技术 实习\sketch_jul10a_copy_20250714175331\sketch_jul10a_copy_20250714175331.ino:97:10: error: 'class U8G2_SH1106_128X64_NONAME_F_HW_I2C' has no member named 'drawStr_P'; did you mean 'drawStr'? D:\徐景川作业相关\传感器实验\智能传感与检测技术 实习\sketch_jul10a_copy_20250714175331\sketch_jul10a_copy_20250714175331.ino:98:10: error: 'class U8G2_SH1106_128X64_NONAME_F_HW_I2C' has no member named 'drawStr_P'; did you mean 'drawStr'? D:\徐景川作业相关\传感器实验\智能传感与检测技术 实习\sketch_jul10a_copy_20250714175331\sketch_jul10a_copy_20250714175331.ino: In function 'void displayData(int32_t, int8_t, int32_t, int8_t)': D:\徐景川作业相关\传感器实验\智能传感与检测技术 实习\sketch_jul10a_copy_20250714175331\sketch_jul10a_copy_20250714175331.ino:156:10: error: 'class U8G2_SH1106_128X64_NONAME_F_HW_I2C' has no member named 'drawStr_P'; did you mean 'drawStr'? exit status 1 Compilation error: 'class U8G2_SH1106_128X64_NONAME_F_HW_I2C' has no member named 'drawStr_P'; did you mean 'drawStr'?

filetype

# # Automatically generated file; DO NOT EDIT. # U-Boot 2022.07 Configuration # CONFIG_CREATE_ARCH_SYMLINK=y CONFIG_SYS_CACHE_SHIFT_5=y CONFIG_SYS_CACHELINE_SIZE=32 # CONFIG_ARC is not set CONFIG_ARM=y # CONFIG_M68K is not set # CONFIG_MICROBLAZE is not set # CONFIG_MIPS is not set # CONFIG_NIOS2 is not set # CONFIG_PPC is not set # CONFIG_RISCV is not set # CONFIG_SANDBOX is not set # CONFIG_SH is not set # CONFIG_X86 is not set # CONFIG_XTENSA is not set CONFIG_SYS_ARCH="arm" CONFIG_SYS_CPU="armv7" CONFIG_SYS_SOC="luofu" CONFIG_SYS_VENDOR="hisilicon" CONFIG_SYS_BOARD="luofu" CONFIG_SYS_CONFIG_NAME="luofu" # CONFIG_SKIP_LOWLEVEL_INIT is not set # CONFIG_SKIP_LOWLEVEL_INIT_ONLY is not set # CONFIG_SYS_ICACHE_OFF is not set # CONFIG_SYS_DCACHE_OFF is not set # # ARM architecture # CONFIG_COUNTER_FREQUENCY=250000000 # CONFIG_POSITION_INDEPENDENT is not set # CONFIG_GIC_V3_ITS is not set CONFIG_HAS_VBAR=y CONFIG_HAS_THUMB2=y CONFIG_ARM_ASM_UNIFIED=y CONFIG_SYS_ARM_CACHE_CP15=y CONFIG_SYS_ARM_MMU=y # CONFIG_SYS_ARM_MPU is not set CONFIG_CPU_V7A=y CONFIG_SYS_ARM_ARCH=7 CONFIG_SYS_ARM_CACHE_WRITEBACK=y # CONFIG_SYS_ARM_CACHE_WRITETHROUGH is not set # CONFIG_SYS_ARM_CACHE_WRITEALLOC is not set # CONFIG_ARCH_CPU_INIT is not set # CONFIG_SYS_ARCH_TIMER is not set # CONFIG_ARM_SMCCC is not set # CONFIG_SEMIHOSTING is not set # CONFIG_SYS_THUMB_BUILD is not set # CONFIG_SYS_L2CACHE_OFF is not set # CONFIG_ENABLE_ARM_SOC_BOOT0_HOOK is not set CONFIG_USE_ARCH_MEMCPY=y CONFIG_USE_ARCH_MEMSET=y # CONFIG_ARCH_AT91 is not set # CONFIG_ARCH_DAVINCI is not set # CONFIG_ARCH_KIRKWOOD is not set # CONFIG_ARCH_MVEBU is not set # CONFIG_ARCH_ORION5X is not set # CONFIG_TARGET_STV0991 is not set # CONFIG_ARCH_BCM283X is not set # CONFIG_ARCH_BCM63158 is not set # CONFIG_ARCH_BCM6753 is not set # CONFIG_ARCH_BCM68360 is not set # CONFIG_ARCH_BCM6858 is not set # CONFIG_ARCH_BCMSTB is not set # CONFIG_TARGET_VEXPRESS_CA9X4 is not set # CONFIG_TARGET_BCMCYGNUS is not set # CONFIG_TARGET_BCMNS2 is not set # CONFIG_TARGET_BCMNS3 is not set # CONFIG_ARCH_EXYNOS is not set # CONFIG_ARCH_S5PC1XX is not set # CONFIG_ARCH_HIGHBANK is not set # CONFIG_ARCH_INTEGRATOR is not set # CONFIG_ARCH_IPQ40XX is not set # CONFIG_ARCH_KEYSTONE is not set # CONFIG_ARCH_K3 is not set # CONFIG_ARCH_OMAP2PLUS is not set # CONFIG_ARCH_MESON is not set # CONFIG_ARCH_MEDIATEK is not set # CONFIG_ARCH_LPC32XX is not set # CONFIG_ARCH_IMX8 is not set # CONFIG_ARCH_IMX8M is not set # CONFIG_ARCH_IMX8ULP is not set # CONFIG_ARCH_IMXRT is not set # CONFIG_ARCH_MX23 is not set # CONFIG_ARCH_MX28 is not set # CONFIG_ARCH_MX31 is not set # CONFIG_ARCH_MX7ULP is not set # CONFIG_ARCH_MX7 is not set # CONFIG_ARCH_MX6 is not set # CONFIG_ARCH_MX5 is not set # CONFIG_ARCH_NEXELL is not set # CONFIG_ARCH_NPCM is not set # CONFIG_ARCH_APPLE is not set # CONFIG_ARCH_OWL is not set # CONFIG_ARCH_QEMU is not set # CONFIG_ARCH_RMOBILE is not set # CONFIG_ARCH_SNAPDRAGON is not set # CONFIG_ARCH_SOCFPGA is not set # CONFIG_ARCH_SUNXI is not set # CONFIG_ARCH_U8500 is not set # CONFIG_ARCH_VERSAL is not set # CONFIG_ARCH_VF610 is not set # CONFIG_ARCH_ZYNQ is not set # CONFIG_ARCH_ZYNQMP_R5 is not set # CONFIG_ARCH_ZYNQMP is not set # CONFIG_ARCH_TEGRA is not set # CONFIG_ARCH_VEXPRESS64 is not set # CONFIG_TARGET_TOTAL_COMPUTE is not set # CONFIG_TARGET_LS2080A_EMU is not set # CONFIG_TARGET_LS1088AQDS is not set # CONFIG_TARGET_LS2080AQDS is not set # CONFIG_TARGET_LS2080ARDB is not set # CONFIG_TARGET_LS2081ARDB is not set # CONFIG_TARGET_LX2160ARDB is not set # CONFIG_TARGET_LX2160AQDS is not set # CONFIG_TARGET_LX2162AQDS is not set # CONFIG_TARGET_HIKEY is not set # CONFIG_TARGET_HIKEY960 is not set # CONFIG_TARGET_POPLAR is not set # CONFIG_TARGET_LS1012AQDS is not set # CONFIG_TARGET_LS1012ARDB is not set # CONFIG_TARGET_LS1012A2G5RDB is not set # CONFIG_TARGET_LS1012AFRWY is not set # CONFIG_TARGET_LS1012AFRDM is not set # CONFIG_TARGET_LS1028AQDS is not set # CONFIG_TARGET_LS1028ARDB is not set # CONFIG_TARGET_LS1088ARDB is not set # CONFIG_TARGET_LS1021AQDS is not set # CONFIG_TARGET_LS1021ATWR is not set # CONFIG_TARGET_PG_WCOM_SELI8 is not set # CONFIG_TARGET_PG_WCOM_EXPU1 is not set # CONFIG_TARGET_LS1021ATSN is not set # CONFIG_TARGET_LS1021AIOT is not set # CONFIG_TARGET_LS1043AQDS is not set # CONFIG_TARGET_LS1043ARDB is not set # CONFIG_TARGET_LS1046AQDS is not set # CONFIG_TARGET_LS1046ARDB is not set # CONFIG_TARGET_LS1046AFRWY is not set # CONFIG_TARGET_SL28 is not set # CONFIG_TARGET_TEN64 is not set # CONFIG_ARCH_UNIPHIER is not set # CONFIG_ARCH_SYNQUACER is not set # CONFIG_ARCH_STM32 is not set # CONFIG_ARCH_STI is not set # CONFIG_ARCH_STM32MP is not set # CONFIG_ARCH_ROCKCHIP is not set # CONFIG_ARCH_OCTEONTX is not set # CONFIG_ARCH_OCTEONTX2 is not set # CONFIG_TARGET_THUNDERX_88XX is not set # CONFIG_ARCH_ASPEED is not set # CONFIG_TARGET_DURIAN is not set # CONFIG_TARGET_POMELO is not set # CONFIG_TARGET_PRESIDIO_ASIC is not set # CONFIG_TARGET_XENGUEST_ARM64 is not set CONFIG_TARGET_LUOFU=y # CONFIG_TARGET_XILING is not set # CONFIG_TARGET_EMEI is not set # CONFIG_TARGET_QISHAN is not set # CONFIG_TARGET_TIANGONG2 is not set # CONFIG_TARGET_TIANGONG1 is not set CONFIG_SUPPORT_PASSING_ATAGS=y # CONFIG_SETUP_MEMORY_TAGS is not set # CONFIG_CMDLINE_TAG is not set # CONFIG_INITRD_TAG is not set # CONFIG_REVISION_TAG is not set CONFIG_SERIAL_TAG=y # CONFIG_STATIC_MACH_TYPE is not set CONFIG_SYS_TEXT_BASE=0x80040000 CONFIG_SYS_MALLOC_LEN=0x1400000 CONFIG_SYS_MALLOC_F_LEN=0x4000 CONFIG_NR_DRAM_BANKS=1 CONFIG_ENV_SIZE=0x20000 CONFIG_ENV_OFFSET=0x240000 CONFIG_DM_GPIO=y CONFIG_DEFAULT_DEVICE_TREE="luofu" CONFIG_MULTI_DTB_FIT_UNCOMPRESS_SZ=0x8000 CONFIG_ERR_PTR_OFFSET=0x0 CONFIG_BOOTSTAGE_STASH_ADDR=0 CONFIG_ENV_OFFSET_REDUND=0x280000 CONFIG_IDENT_STRING=" for luofu" CONFIG_SYS_CLK_FREQ=0 # CONFIG_CHIP_DIP_SCAN is not set # CONFIG_HAS_ARMV7_SECURE_BASE is not set # CONFIG_ARMV7_LPAE is not set # CONFIG_CMD_DEKBLOB is not set # CONFIG_IMX_CAAM_DEK_ENCAP is not set # CONFIG_IMX_OPTEE_DEK_ENCAP is not set # CONFIG_IMX_SECO_DEK_ENCAP is not set # CONFIG_CMD_HDMIDETECT is not set # CONFIG_CMD_NANDBCB is not set CONFIG_IMX_DCD_ADDR=0x00910000 CONFIG_SYS_MEM_TOP_HIDE=0x0 CONFIG_SYS_LOAD_ADDR=0x83200000 # # ARM debug # # CONFIG_DEBUG_LL is not set CONFIG_HSAN=y CONFIG_MULTIUPG=y CONFIG_ACTIVE_STANDBY_BOOT=y CONFIG_CHIP_LUOFU=y CONFIG_BUILD_TARGET="" # CONFIG_DEBUG_UART is not set # CONFIG_AHCI is not set # CONFIG_OF_BOARD_FIXUP is not set # # General setup # CONFIG_LOCALVERSION="" CONFIG_LOCALVERSION_AUTO=y CONFIG_CC_OPTIMIZE_FOR_SIZE=y # CONFIG_CC_OPTIMIZE_FOR_SPEED is not set # CONFIG_CC_OPTIMIZE_FOR_DEBUG is not set # CONFIG_OPTIMIZE_INLINING is not set CONFIG_ARCH_SUPPORTS_LTO=y # CONFIG_LTO is not set # CONFIG_XEN is not set # CONFIG_DISTRO_DEFAULTS is not set # CONFIG_ENV_VARS_UBOOT_CONFIG is not set # CONFIG_SYS_BOOT_GET_CMDLINE is not set # CONFIG_SYS_BOOT_GET_KBD is not set CONFIG_SYS_MALLOC_F=y # CONFIG_VALGRIND is not set CONFIG_EXPERT=y CONFIG_SYS_MALLOC_CLEAR_ON_INIT=y # CONFIG_SYS_MALLOC_DEFAULT_TO_INIT is not set # CONFIG_TOOLS_DEBUG is not set # CONFIG_PHYS_64BIT is not set # CONFIG_REMAKE_ELF is not set # CONFIG_HAS_BOARD_SIZE_LIMIT is not set # CONFIG_SYS_CUSTOM_LDSCRIPT is not set CONFIG_PLATFORM_ELFENTRY="_start" CONFIG_STACK_SIZE=0x1000000 CONFIG_SYS_SRAM_BASE=0x0 CONFIG_SYS_SRAM_SIZE=0x0 # CONFIG_MP is not set # CONFIG_EXAMPLES is not set # # API # # CONFIG_API is not set # # Boot options # # # Boot images # # CONFIG_ANDROID_BOOT_IMAGE is not set # CONFIG_FIT is not set # CONFIG_TIMESTAMP is not set CONFIG_BOOTSTD=y # CONFIG_BOOTSTD_FULL is not set CONFIG_BOOTSTD_BOOTCOMMAND=y # CONFIG_BOOTMETH_SCRIPT is not set CONFIG_LEGACY_IMAGE_FORMAT=y # CONFIG_SUPPORT_RAW_INITRD is not set # CONFIG_OF_BOARD_SETUP is not set # CONFIG_OF_SYSTEM_SETUP is not set # CONFIG_OF_STDOUT_VIA_ALIAS is not set CONFIG_SYS_EXTRA_OPTIONS="" CONFIG_HAVE_SYS_TEXT_BASE=y # CONFIG_DYNAMIC_SYS_CLK_FREQ is not set CONFIG_ARCH_FIXUP_FDT_MEMORY=y # CONFIG_CHROMEOS is not set # CONFIG_CHROMEOS_VBOOT is not set # CONFIG_RAMBOOT_PBL is not set # # Boot timing # # CONFIG_BOOTSTAGE is not set CONFIG_BOOTSTAGE_STASH_SIZE=0x1000 # CONFIG_SHOW_BOOT_PROGRESS is not set # # Boot media # # CONFIG_NAND_BOOT is not set # CONFIG_ONENAND_BOOT is not set # CONFIG_QSPI_BOOT is not set # CONFIG_SATA_BOOT is not set # CONFIG_SD_BOOT is not set # CONFIG_SD_BOOT_QSPI is not set # CONFIG_SPI_BOOT is not set # # Autoboot options # CONFIG_AUTOBOOT=y CONFIG_BOOTDELAY=3 # CONFIG_AUTOBOOT_KEYED is not set # CONFIG_AUTOBOOT_USE_MENUKEY is not set # CONFIG_AUTOBOOT_MENU_SHOW is not set # CONFIG_BOOT_RETRY is not set # # Image support # # CONFIG_IMAGE_PRE_LOAD is not set # CONFIG_USE_BOOTARGS is not set # CONFIG_BOOTARGS_SUBST is not set # CONFIG_USE_BOOTCOMMAND is not set # CONFIG_USE_PREBOOT is not set CONFIG_DEFAULT_FDT_FILE="" # CONFIG_SAVE_PREV_BL_FDT_ADDR is not set # CONFIG_SAVE_PREV_BL_INITRAMFS_START_ADDR is not set # # Console # CONFIG_MENU=y # CONFIG_CONSOLE_RECORD is not set # CONFIG_DISABLE_CONSOLE is not set CONFIG_LOGLEVEL=4 CONFIG_SPL_LOGLEVEL=4 CONFIG_TPL_LOGLEVEL=4 # CONFIG_SILENT_CONSOLE is not set # CONFIG_PRE_CONSOLE_BUFFER is not set # CONFIG_CONSOLE_MUX is not set # CONFIG_SYS_CONSOLE_IS_IN_ENV is not set # CONFIG_SYS_CONSOLE_OVERWRITE_ROUTINE is not set # CONFIG_SYS_CONSOLE_ENV_OVERWRITE is not set # CONFIG_SYS_CONSOLE_INFO_QUIET is not set # CONFIG_SYS_STDIO_DEREGISTER is not set # CONFIG_SPL_SYS_STDIO_DEREGISTER is not set # CONFIG_SYS_DEVICE_NULLDEV is not set # # Logging # # CONFIG_LOG is not set # # Init options # # CONFIG_BOARD_TYPES is not set # CONFIG_DISPLAY_CPUINFO is not set # CONFIG_DISPLAY_BOARDINFO is not set # CONFIG_DISPLAY_BOARDINFO_LATE is not set # # Start-up hooks # # CONFIG_EVENT is not set # CONFIG_ARCH_EARLY_INIT_R is not set # CONFIG_ARCH_MISC_INIT is not set # CONFIG_BOARD_EARLY_INIT_F is not set # CONFIG_BOARD_EARLY_INIT_R is not set # CONFIG_BOARD_POSTCLK_INIT is not set CONFIG_BOARD_LATE_INIT=y # CONFIG_CLOCKS is not set # CONFIG_LAST_STAGE_INIT is not set CONFIG_MISC_INIT_R=y # CONFIG_ID_EEPROM is not set # CONFIG_RESET_PHY_R is not set # # Security support # # CONFIG_STACKPROTECTOR is not set # # Update support # # CONFIG_ANDROID_AB is not set # # Blob list # # CONFIG_BLOBLIST is not set # # SPL / TPL / VPL # CONFIG_SPL_SYS_STACK_F_CHECK_BYTE=0xaa # CONFIG_SPL_SYS_REPORT_STACK_F_USAGE is not set # CONFIG_SPL_SHOW_ERRORS is not set # # PowerPC and LayerScape SPL Boot options # # CONFIG_SPL_MD5 is not set # CONFIG_FDT_SIMPLEFB is not set # # Command line interface # CONFIG_CMDLINE=y # CONFIG_HUSH_PARSER is not set CONFIG_CMDLINE_EDITING=y CONFIG_AUTO_COMPLETE=y CONFIG_SYS_LONGHELP=y CONFIG_SYS_PROMPT="luofu # " CONFIG_SYS_XTRACE=y # # Commands # # # Info commands # # CONFIG_CMD_BDI is not set # CONFIG_CMD_CONFIG is not set # CONFIG_CMD_CONSOLE is not set # CONFIG_CMD_CPU is not set # CONFIG_CMD_LICENSE is not set # CONFIG_CMD_PMC is not set # # Boot commands # CONFIG_CMD_BOOTD=y CONFIG_CMD_BOOTM=y # CONFIG_CMD_BOOTDEV is not set # CONFIG_CMD_BOOTFLOW is not set # CONFIG_CMD_BOOTMETH is not set # CONFIG_CMD_BOOTZ is not set CONFIG_BOOTM_LINUX=y # CONFIG_BOOTM_NETBSD is not set # CONFIG_BOOTM_OPENRTOS is not set # CONFIG_BOOTM_OSE is not set # CONFIG_BOOTM_PLAN9 is not set # CONFIG_BOOTM_RTEMS is not set # CONFIG_BOOTM_VXWORKS is not set CONFIG_CMD_BOOTMENU=y # CONFIG_CMD_ADTIMG is not set # CONFIG_CMD_ELF is not set CONFIG_CMD_FDT=y CONFIG_CMD_GO=y CONFIG_CMD_RUN=y # CONFIG_CMD_IMI is not set # CONFIG_CMD_IMLS is not set # CONFIG_CMD_XIMG is not set # CONFIG_CMD_THOR_DOWNLOAD is not set # CONFIG_CMD_ZBOOT is not set # # Environment commands # # CONFIG_CMD_ASKENV is not set # CONFIG_CMD_EXPORTENV is not set # CONFIG_CMD_IMPORTENV is not set # CONFIG_CMD_EDITENV is not set # CONFIG_CMD_GREPENV is not set CONFIG_CMD_SAVEENV=y # CONFIG_CMD_ERASEENV is not set # CONFIG_CMD_ENV_EXISTS is not set # CONFIG_CMD_ENV_CALLBACK is not set # CONFIG_CMD_ENV_FLAGS is not set # CONFIG_CMD_NVEDIT_INDIRECT is not set # CONFIG_CMD_NVEDIT_INFO is not set # CONFIG_CMD_NVEDIT_LOAD is not set # CONFIG_CMD_NVEDIT_SELECT is not set # # Memory commands # # CONFIG_CMD_BINOP is not set # CONFIG_CMD_BLOBLIST is not set # CONFIG_CMD_CRC32 is not set # CONFIG_CMD_EEPROM is not set # CONFIG_LOOPW is not set # CONFIG_CMD_MD5SUM is not set # CONFIG_CMD_MEMINFO is not set CONFIG_CMD_MEMORY=y # CONFIG_CMD_MEM_SEARCH is not set # CONFIG_CMD_MX_CYCLIC is not set # CONFIG_CMD_RANDOM is not set # CONFIG_CMD_MEMTEST is not set # CONFIG_CMD_SHA1SUM is not set # CONFIG_CMD_STRINGS is not set # # Compression commands # # CONFIG_CMD_LZMADEC is not set # CONFIG_CMD_UNLZ4 is not set # CONFIG_CMD_UNZIP is not set # CONFIG_CMD_ZIP is not set # # Device access commands # # CONFIG_CMD_ARMFLASH is not set # CONFIG_CMD_BIND is not set # CONFIG_CMD_CLK is not set # CONFIG_CMD_DEMO is not set # CONFIG_CMD_DFU is not set # CONFIG_CMD_DM is not set # CONFIG_CMD_FLASH is not set # CONFIG_CMD_FPGAD is not set # CONFIG_CMD_FUSE is not set CONFIG_CMD_GPIO=y # CONFIG_CMD_GPIO_READ is not set # CONFIG_CMD_GPT is not set # CONFIG_RANDOM_UUID is not set # CONFIG_CMD_IDE is not set # CONFIG_CMD_IO is not set # CONFIG_CMD_IOTRACE is not set # CONFIG_CMD_I2C is not set # CONFIG_CMD_LOADB is not set # CONFIG_CMD_LOADS is not set # CONFIG_CMD_LSBLK is not set # CONFIG_CMD_MBR is not set # CONFIG_CMD_MISC is not set # CONFIG_CMD_CLONE is not set CONFIG_CMD_MTD=y CONFIG_CMD_NAND=y # CONFIG_CMD_NAND_TRIMFFS is not set # CONFIG_CMD_NAND_LOCK_UNLOCK is not set # CONFIG_CMD_NAND_TORTURE is not set # CONFIG_CMD_ONENAND is not set # CONFIG_CMD_OSD is not set # CONFIG_CMD_PCI is not set # CONFIG_CMD_POWEROFF is not set # CONFIG_CMD_READ is not set # CONFIG_CMD_SATA is not set # CONFIG_CMD_SAVES is not set # CONFIG_CMD_SCSI is not set # CONFIG_CMD_SDRAM is not set # CONFIG_CMD_TSI148 is not set # CONFIG_CMD_UNIVERSE is not set # CONFIG_CMD_USB_SDP is not set # CONFIG_CMD_WDT is not set # # Shell scripting commands # # CONFIG_CMD_ECHO is not set # CONFIG_CMD_ITEST is not set # CONFIG_CMD_SOURCE is not set # CONFIG_CMD_SETEXPR is not set # # Android support commands # CONFIG_CMD_NET=y CONFIG_CMD_BOOTP=y # CONFIG_CMD_DHCP is not set # CONFIG_BOOTP_MAY_FAIL is not set CONFIG_BOOTP_BOOTPATH=y # CONFIG_BOOTP_VENDOREX is not set # CONFIG_BOOTP_BOOTFILESIZE is not set CONFIG_BOOTP_DNS=y # CONFIG_BOOTP_DNS2 is not set CONFIG_BOOTP_GATEWAY=y CONFIG_BOOTP_HOSTNAME=y # CONFIG_BOOTP_PREFER_SERVERIP is not set CONFIG_BOOTP_SUBNETMASK=y # CONFIG_BOOTP_NISDOMAIN is not set # CONFIG_BOOTP_NTPSERVER is not set # CONFIG_CMD_PCAP is not set CONFIG_BOOTP_VCI_STRING="U-Boot.armv7" CONFIG_CMD_TFTPBOOT=y # CONFIG_CMD_TFTPPUT is not set # CONFIG_CMD_TFTPSRV is not set CONFIG_NET_TFTP_VARS=y # CONFIG_CMD_RARP is not set # CONFIG_CMD_NFS is not set # CONFIG_CMD_MII is not set # CONFIG_CMD_MDIO is not set CONFIG_CMD_PING=y # CONFIG_CMD_CDP is not set # CONFIG_CMD_SNTP is not set # CONFIG_CMD_DNS is not set # CONFIG_CMD_LINK_LOCAL is not set # CONFIG_CMD_ETHSW is not set # CONFIG_CMD_PXE is not set # CONFIG_CMD_WOL is not set # # Misc commands # # CONFIG_CMD_BSP is not set # CONFIG_CMD_BLOCK_CACHE is not set CONFIG_CMD_CACHE=y # CONFIG_CMD_CONITRACE is not set # CONFIG_CMD_EXCEPTION is not set # CONFIG_CMD_DATE is not set # CONFIG_CMD_TIME is not set # CONFIG_CMD_GETTIME is not set # CONFIG_CMD_SLEEP is not set # CONFIG_CMD_TIMER is not set # CONFIG_CMD_SYSBOOT is not set # CONFIG_CMD_QFW is not set # CONFIG_CMD_PSTORE is not set # CONFIG_CMD_TERMINAL is not set # CONFIG_CMD_UUID is not set # # TI specific command line interface # # CONFIG_CMD_DDR3 is not set # # Power commands # # # Security commands # # CONFIG_CMD_AES is not set # CONFIG_CMD_BLOB is not set # CONFIG_CMD_HASH is not set # # Firmware commands # # # Filesystem commands # # CONFIG_CMD_BTRFS is not set # CONFIG_CMD_EROFS is not set # CONFIG_CMD_EXT2 is not set # CONFIG_CMD_EXT4 is not set # CONFIG_CMD_FAT is not set # CONFIG_CMD_SQUASHFS is not set # CONFIG_CMD_FS_GENERIC is not set # CONFIG_CMD_FS_UUID is not set # CONFIG_CMD_JFFS2 is not set CONFIG_CMD_MTDPARTS=y # CONFIG_CMD_MTDPARTS_SPREAD is not set # CONFIG_CMD_MTDPARTS_SHOW_NET_SIZES is not set CONFIG_MTDIDS_DEFAULT="nand0=hi_nfc,nor0=hi_sfc" CONFIG_MTDPARTS_DEFAULT="" # CONFIG_CMD_REISER is not set # CONFIG_CMD_ZFS is not set # # Debug commands # # CONFIG_CMD_DIAG is not set # CONFIG_CMD_EVENT is not set # CONFIG_CMD_LOG is not set # CONFIG_CMD_UBI is not set # # Partition Types # # CONFIG_MAC_PARTITION is not set # CONFIG_DOS_PARTITION is not set # CONFIG_ISO_PARTITION is not set # CONFIG_AMIGA_PARTITION is not set # CONFIG_EFI_PARTITION is not set CONFIG_SUPPORT_OF_CONTROL=y # # Device Tree Control # CONFIG_OF_CONTROL=y CONFIG_OF_REAL=y # CONFIG_OF_LIVE is not set CONFIG_OF_SEPARATE=y # CONFIG_OF_EMBED is not set # CONFIG_OF_BOARD is not set CONFIG_OF_OMIT_DTB=y CONFIG_DEVICE_TREE_INCLUDES="" CONFIG_OF_LIST="luofu" # CONFIG_MULTI_DTB_FIT is not set # CONFIG_OF_DTB_PROPS_REMOVE is not set CONFIG_VPL_OF_REAL=y # # Environment # CONFIG_ENV_SUPPORT=y CONFIG_ENV_SOURCE_FILE="" CONFIG_SAVEENV=y # CONFIG_ENV_OVERWRITE is not set # CONFIG_ENV_IS_NOWHERE is not set # CONFIG_ENV_IS_IN_EEPROM is not set # CONFIG_ENV_IS_IN_FAT is not set # CONFIG_ENV_IS_IN_EXT4 is not set # CONFIG_ENV_IS_IN_FLASH is not set CONFIG_ENV_IS_IN_NAND=y # CONFIG_ENV_IS_IN_NVRAM is not set # CONFIG_ENV_IS_IN_ONENAND is not set # CONFIG_ENV_IS_IN_REMOTE is not set CONFIG_SYS_REDUNDAND_ENVIRONMENT=y # CONFIG_SYS_RELOC_GD_ENV_ADDR is not set # CONFIG_USE_DEFAULT_ENV_FILE is not set # CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG is not set # CONFIG_ENV_IMPORT_FDT is not set # CONFIG_ENV_APPEND is not set # CONFIG_ENV_WRITEABLE_LIST is not set # CONFIG_ENV_ACCESS_IGNORE_FORCE is not set # CONFIG_USE_BOOTFILE is not set # CONFIG_USE_ETHPRIME is not set # CONFIG_VERSION_VARIABLE is not set CONFIG_NET=y CONFIG_ARP_TIMEOUT=200 CONFIG_NET_RETRY_COUNT=20 # CONFIG_PROT_UDP is not set CONFIG_BOOTDEV_ETH=y # CONFIG_BOOTP_SEND_HOSTNAME is not set CONFIG_NET_RANDOM_ETHADDR=y CONFIG_NETCONSOLE=y # CONFIG_IP_DEFRAG is not set # CONFIG_SYS_FAULT_ECHO_LINK_DOWN is not set CONFIG_TFTP_BLOCKSIZE=512 # CONFIG_TFTP_PORT is not set CONFIG_TFTP_WINDOWSIZE=1 # CONFIG_TFTP_TSIZE is not set # CONFIG_SERVERIP_FROM_PROXYDHCP is not set CONFIG_SERVERIP_FROM_PROXYDHCP_DELAY_MS=100 # CONFIG_KEEP_SERVERADDR is not set # CONFIG_UDP_CHECKSUM is not set # CONFIG_BOOTP_SERVERIP is not set # # Device Drivers # # # Generic Driver Options # CONFIG_DM=y # CONFIG_DM_WARN is not set # CONFIG_DM_DEBUG is not set CONFIG_DM_DEVICE_REMOVE=y # CONFIG_DM_EVENT is not set CONFIG_DM_STDIO=y CONFIG_DM_SEQ_ALIAS=y # CONFIG_DM_DMA is not set CONFIG_REGMAP=y CONFIG_SYSCON=y # CONFIG_DEVRES is not set CONFIG_SIMPLE_BUS=y # CONFIG_SIMPLE_BUS_CORRECT_RANGE is not set # CONFIG_OF_TRANSLATE is not set # CONFIG_TRANSLATION_OFFSET is not set CONFIG_DM_DEV_READ_INLINE=y # CONFIG_ACPIGEN is not set CONFIG_BOUNCE_BUFFER=y # CONFIG_ADC is not set # CONFIG_ADC_EXYNOS is not set # CONFIG_ADC_SANDBOX is not set # CONFIG_SARADC_MESON is not set # CONFIG_SARADC_ROCKCHIP is not set # CONFIG_SATA is not set # CONFIG_SCSI_AHCI is not set # # SATA/SCSI device support # # CONFIG_AXI is not set # # Bus devices # CONFIG_BLK=y CONFIG_HAVE_BLOCK_DEVICE=y CONFIG_BLOCK_CACHE=y # CONFIG_EFI_MEDIA is not set # CONFIG_IDE is not set # CONFIG_BOOTCOUNT_LIMIT is not set # # Button Support # # CONFIG_BUTTON is not set # # Cache Controller drivers # # CONFIG_CACHE is not set CONFIG_L2X0_CACHE=y # CONFIG_NCORE_CACHE is not set # CONFIG_SIFIVE_CCACHE is not set # # Clock # CONFIG_CLK=y # CONFIG_CLK_CCF is not set # CONFIG_CLK_CDCE9XX is not set # CONFIG_CLK_ICS8N3QV01 is not set # CONFIG_CLK_K210 is not set # CONFIG_CLK_MPC83XX is not set # CONFIG_CLK_XLNX_CLKWZRD is not set # CONFIG_CLK_AT91 is not set # CONFIG_CLK_SIFIVE is not set # CONFIG_CLK_TI_AM3_DPLL is not set # CONFIG_CLK_TI_CTRL is not set # CONFIG_CLK_TI_GATE is not set # CONFIG_CLK_K3 is not set CONFIG_CPU=y # # Hardware crypto devices # # CONFIG_DM_HASH is not set # CONFIG_FSL_CAAM is not set # CONFIG_SYS_FSL_SEC_BE is not set # CONFIG_SYS_FSL_SEC_LE is not set # CONFIG_DDR_SPD is not set # # Demo for driver model # # CONFIG_DM_DEMO is not set # # DFU support # # # DMA Support # # CONFIG_DMA is not set # CONFIG_DMA_LPC32XX is not set # CONFIG_TI_EDMA3 is not set # CONFIG_DMA_LEGACY is not set # # Fastboot support # # CONFIG_UDP_FUNCTION_FASTBOOT is not set # CONFIG_FIRMWARE is not set # CONFIG_ZYNQMP_FIRMWARE is not set # # FPGA support # # CONFIG_FPGA_ALTERA is not set # CONFIG_FPGA_SOCFPGA is not set # CONFIG_FPGA_XILINX is not set CONFIG_GPIO=y # CONFIG_GPIO_HOG is not set # CONFIG_DM_GPIO_LOOKUP_LABEL is not set # CONFIG_ALTERA_PIO is not set # CONFIG_BCM2835_GPIO is not set CONFIG_DWAPB_GPIO=y # CONFIG_AT91_GPIO is not set # CONFIG_ATMEL_PIO4 is not set # CONFIG_ASPEED_GPIO is not set # CONFIG_DA8XX_GPIO is not set # CONFIG_INTEL_BROADWELL_GPIO is not set # CONFIG_INTEL_GPIO is not set # CONFIG_INTEL_ICH6_GPIO is not set # CONFIG_IMX_RGPIO2P is not set # CONFIG_IPROC_GPIO is not set # CONFIG_HSDK_CREG_GPIO is not set # CONFIG_KIRKWOOD_GPIO is not set # CONFIG_LPC32XX_GPIO is not set # CONFIG_MCP230XX_GPIO is not set # CONFIG_MSM_GPIO is not set # CONFIG_MXC_GPIO is not set # CONFIG_MXS_GPIO is not set # CONFIG_NPCM_GPIO is not set # CONFIG_CMD_PCA953X is not set # CONFIG_ROCKCHIP_GPIO is not set # CONFIG_XILINX_GPIO is not set # CONFIG_CMD_TCA642X is not set # CONFIG_TEGRA_GPIO is not set # CONFIG_TEGRA186_GPIO is not set # CONFIG_VYBRID_GPIO is not set # CONFIG_SIFIVE_GPIO is not set # CONFIG_ZYNQ_GPIO is not set # CONFIG_DM_74X164 is not set # CONFIG_SPL_DM_PCA953X is not set # CONFIG_MPC8XXX_GPIO is not set # CONFIG_NX_GPIO is not set # CONFIG_NOMADIK_GPIO is not set # CONFIG_ZYNQMP_GPIO_MODEPIN is not set # CONFIG_SLG7XL45106_I2C_GPO is not set # # Hardware Spinlock Support # # CONFIG_DM_HWSPINLOCK is not set # CONFIG_I2C is not set # CONFIG_INPUT is not set # CONFIG_DM_KEYBOARD is not set # CONFIG_KEYBOARD is not set # CONFIG_TEGRA_KEYBOARD is not set # CONFIG_TWL4030_INPUT is not set # # IOMMU device drivers # # CONFIG_IOMMU is not set # # LED Support # # CONFIG_LED is not set # CONFIG_LED_STATUS is not set # # Mailbox Controller Support # # CONFIG_DM_MAILBOX is not set # # Memory Controller drivers # # # Multifunction device drivers # CONFIG_MISC=y # CONFIG_ALTERA_SYSID is not set # CONFIG_ATSHA204A is not set # CONFIG_GATEWORKS_SC is not set # CONFIG_ROCKCHIP_EFUSE is not set # CONFIG_ROCKCHIP_OTP is not set # CONFIG_SIFIVE_OTP is not set # CONFIG_VEXPRESS_CONFIG is not set # CONFIG_CROS_EC is not set # CONFIG_DS4510 is not set # CONFIG_FSL_SEC_MON is not set # CONFIG_IRQ is not set # CONFIG_NUVOTON_NCT6102D is not set # CONFIG_PWRSEQ is not set # CONFIG_PCA9551_LED is not set # CONFIG_TEST_DRV is not set # CONFIG_TWL4030_LED is not set # CONFIG_WINBOND_W83627 is not set # CONFIG_I2C_EEPROM is not set # CONFIG_GDSYS_RXAUI_CTRL is not set # CONFIG_GDSYS_IOEP is not set # CONFIG_MPC83XX_SERDES is not set # CONFIG_FS_LOADER is not set # CONFIG_SPL_FS_LOADER is not set # CONFIG_GDSYS_SOC is not set # CONFIG_IHS_FPGA is not set # CONFIG_MICROCHIP_FLEXCOM is not set # # MMC Host controller Support # # CONFIG_MMC is not set # CONFIG_MMC_BROKEN_CD is not set # CONFIG_DM_MMC is not set # CONFIG_FSL_ESDHC is not set # CONFIG_FSL_ESDHC_IMX is not set # # MTD Support # CONFIG_MTD_PARTITIONS=y CONFIG_MTD=y CONFIG_DM_MTD=y # CONFIG_MTD_NOR_FLASH is not set # CONFIG_MTD_CONCAT is not set CONFIG_SYS_MTDPARTS_RUNTIME=y # CONFIG_FLASH_CFI_DRIVER is not set # CONFIG_CFI_FLASH is not set # CONFIG_ALTERA_QSPI is not set # CONFIG_HBMC_AM654 is not set # CONFIG_USE_SYS_MAX_FLASH_BANKS is not set CONFIG_MTD_RAW_NAND=y # CONFIG_SYS_NAND_DRIVER_ECC_LAYOUT is not set CONFIG_SYS_NAND_USE_FLASH_BBT=y # CONFIG_NAND_ATMEL is not set # CONFIG_NAND_BRCMNAND is not set # CONFIG_NAND_DAVINCI is not set # CONFIG_NAND_DENALI_DT is not set # CONFIG_NAND_FSL_IFC is not set # CONFIG_NAND_LPC32XX_MLC is not set # CONFIG_NAND_LPC32XX_SLC is not set # CONFIG_NAND_VF610_NFC is not set # CONFIG_NAND_PXA3XX is not set # CONFIG_NAND_ARASAN is not set # CONFIG_NAND_MXIC is not set # CONFIG_NAND_ZYNQ is not set # CONFIG_NAND_OCTEONTX is not set # # Generic NAND options # # CONFIG_SYS_NAND_ONFI_DETECTION is not set # # SPI Flash Support # # CONFIG_SPI_FLASH is not set # # UBI support # # CONFIG_UBI_SILENCE_MSG is not set # CONFIG_MTD_UBI is not set # # Multiplexer drivers # # CONFIG_MULTIPLEXER is not set # CONFIG_BITBANGMII is not set # CONFIG_MV88E6352_SWITCH is not set CONFIG_PHYLIB=y # CONFIG_PHY_ADDR_ENABLE is not set # CONFIG_B53_SWITCH is not set # CONFIG_MV88E61XX_SWITCH is not set # CONFIG_PHYLIB_10G is not set # CONFIG_PHY_ADIN is not set # CONFIG_PHY_AQUANTIA is not set # CONFIG_PHY_ATHEROS is not set # CONFIG_PHY_BROADCOM is not set # CONFIG_PHY_CORTINA is not set # CONFIG_PHY_DAVICOM is not set # CONFIG_PHY_ET1011C is not set # CONFIG_PHY_LXT is not set # CONFIG_PHY_MARVELL is not set # CONFIG_PHY_MESON_GXL is not set # CONFIG_PHY_MICREL is not set # CONFIG_PHY_MSCC is not set # CONFIG_PHY_NATSEMI is not set # CONFIG_PHY_NXP_C45_TJA11XX is not set # CONFIG_PHY_NXP_TJA11XX is not set # CONFIG_PHY_REALTEK is not set # CONFIG_PHY_SMSC is not set # CONFIG_PHY_TERANETICS is not set # CONFIG_PHY_TI is not set # CONFIG_PHY_TI_DP83867 is not set # CONFIG_PHY_TI_DP83869 is not set # CONFIG_PHY_TI_GENERIC is not set # CONFIG_PHY_VITESSE is not set # CONFIG_PHY_XILINX is not set # CONFIG_PHY_XILINX_GMII2RGMII is not set # CONFIG_PHY_ETHERNET_ID is not set # CONFIG_PHY_FIXED is not set # CONFIG_PHY_NCSI is not set CONFIG_PHY_RESET_DELAY=0 # CONFIG_FSL_PFE is not set # CONFIG_BNXT_ETH is not set CONFIG_ETH=y CONFIG_DM_ETH=y # CONFIG_DM_MDIO is not set # CONFIG_DM_ETH_PHY is not set CONFIG_NETDEVICES=y # CONFIG_PHY_GIGE is not set # CONFIG_ALTERA_TSE is not set # CONFIG_BCM_SF2_ETH is not set # CONFIG_BCMGENET is not set # CONFIG_CALXEDA_XGMAC is not set # CONFIG_DRIVER_DM9000 is not set # CONFIG_DWC_ETH_QOS is not set # CONFIG_EEPRO100 is not set # CONFIG_ETH_DESIGNWARE is not set # CONFIG_ETH_DESIGNWARE_MESON8B is not set # CONFIG_ETHOC is not set # CONFIG_FMAN_ENET is not set # CONFIG_FTMAC100 is not set # CONFIG_FTGMAC100 is not set # CONFIG_MCFFEC is not set # CONFIG_FSLDMAFEC is not set # CONFIG_KS8851_MLL is not set # CONFIG_MACB is not set # CONFIG_PCH_GBE is not set # CONFIG_RGMII is not set CONFIG_MII=y # CONFIG_RMII is not set # CONFIG_PCNET is not set # CONFIG_QE_UEC is not set # CONFIG_RTL8139 is not set # CONFIG_RTL8169 is not set # CONFIG_SMC911X is not set # CONFIG_SUN7I_GMAC is not set # CONFIG_SUN4I_EMAC is not set # CONFIG_SUN8I_EMAC is not set # CONFIG_SH_ETHER is not set # CONFIG_DRIVER_TI_CPSW is not set # CONFIG_DRIVER_TI_EMAC is not set # CONFIG_DRIVER_TI_KEYSTONE_NET is not set # CONFIG_TULIP is not set # CONFIG_XILINX_AXIEMAC is not set # CONFIG_XILINX_EMACLITE is not set # CONFIG_ZYNQ_GEM is not set # CONFIG_SYS_DPAA_QBMAN is not set # CONFIG_TSEC_ENET is not set # CONFIG_MEDIATEK_ETH is not set # CONFIG_HIGMACV300_ETH is not set # CONFIG_NVME is not set # CONFIG_NVME_APPLE is not set # CONFIG_PCI is not set # # PCI Endpoint # # CONFIG_PCI_ENDPOINT is not set # CONFIG_X86_PCH7 is not set # CONFIG_X86_PCH9 is not set # # PHY Subsystem # CONFIG_PHY=y # CONFIG_NOP_PHY is not set # CONFIG_MIPI_DPHY_HELPERS is not set # CONFIG_BCM_SR_PCIE_PHY is not set # CONFIG_MSM8916_USB_PHY is not set # CONFIG_OMAP_USB2_PHY is not set # # Rockchip PHY driver # # CONFIG_PHY_CADENCE_SIERRA is not set # CONFIG_PHY_CADENCE_TORRENT is not set # CONFIG_MVEBU_COMPHY_SUPPORT is not set # # Pin controllers # # CONFIG_PINCTRL is not set # CONFIG_POWER_LEGACY is not set # CONFIG_SPL_POWER_LEGACY is not set # CONFIG_ACPI_PMC is not set # CONFIG_SPL_ACPI_PMC is not set # CONFIG_TPL_ACPI_PMC is not set # # Power Domain Support # # CONFIG_POWER_DOMAIN is not set # CONFIG_DM_PMIC is not set # CONFIG_PMIC_TPS65217 is not set # CONFIG_POWER_MC34VR500 is not set # CONFIG_DM_REGULATOR is not set # CONFIG_POWER_MT6323 is not set # CONFIG_DM_PWM is not set # CONFIG_PWM_IMX is not set # CONFIG_PWM_SANDBOX is not set # CONFIG_U_QE is not set # CONFIG_RAM is not set # # Reboot Mode Support # # CONFIG_DM_REBOOT_MODE is not set # # Remote Processor drivers # # # Reset Controller Support # CONFIG_DM_RESET=y # CONFIG_RESET_AST2500 is not set # CONFIG_RESET_AST2600 is not set # CONFIG_RESET_HISILICON is not set # CONFIG_RESET_SYSCON is not set # CONFIG_RESET_SCMI is not set # CONFIG_RESET_DRA7 is not set # CONFIG_DM_RNG is not set # # Real Time Clock # # CONFIG_DM_RTC is not set # CONFIG_RTC_ENABLE_32KHZ_OUTPUT is not set # CONFIG_RTC_PCF8563 is not set # CONFIG_RTC_PL031 is not set # CONFIG_RTC_S35392A is not set # CONFIG_RTC_MC146818 is not set # CONFIG_RTC_M41T62 is not set # CONFIG_SCSI is not set # CONFIG_DM_SCSI is not set CONFIG_SERIAL=y CONFIG_BAUDRATE=115200 CONFIG_REQUIRE_SERIAL_CONSOLE=y CONFIG_SPECIFY_CONSOLE_INDEX=y CONFIG_SERIAL_PRESENT=y CONFIG_CONS_INDEX=1 CONFIG_DM_SERIAL=y # CONFIG_SERIAL_RX_BUFFER is not set # CONFIG_SERIAL_PUTS is not set # CONFIG_SERIAL_SEARCH_ALL is not set # CONFIG_SERIAL_PROBE_ALL is not set # CONFIG_VPL_DM_SERIAL is not set # CONFIG_ALTERA_JTAG_UART is not set # CONFIG_ALTERA_UART is not set # CONFIG_ARC_SERIAL is not set # CONFIG_ARM_DCC is not set # CONFIG_ATMEL_USART is not set # CONFIG_BCM6345_SERIAL is not set # CONFIG_COREBOOT_SERIAL is not set # CONFIG_CORTINA_UART is not set # CONFIG_FSL_LINFLEXUART is not set # CONFIG_FSL_LPUART is not set # CONFIG_MVEBU_A3700_UART is not set # CONFIG_MCFUART is not set # CONFIG_NULLDEV_SERIAL is not set CONFIG_SYS_NS16550=y # CONFIG_NS16550_DYNAMIC is not set # CONFIG_PL01X_SERIAL is not set # CONFIG_ROCKCHIP_SERIAL is not set # CONFIG_XILINX_UARTLITE is not set # CONFIG_MSM_SERIAL is not set # CONFIG_MSM_GENI_SERIAL is not set # CONFIG_OMAP_SERIAL is not set # CONFIG_PXA_SERIAL is not set # CONFIG_SIFIVE_SERIAL is not set # CONFIG_ZYNQ_SERIAL is not set # CONFIG_MTK_SERIAL is not set # CONFIG_MT7620_SERIAL is not set # CONFIG_NPCM_SERIAL is not set # CONFIG_SMEM is not set # # Sound support # # CONFIG_SOUND is not set # # SOC (System On Chip) specific Drivers # # CONFIG_SOC_DEVICE is not set # CONFIG_SOC_TI is not set # CONFIG_SPI is not set # # SPMI support # # CONFIG_SPMI is not set # CONFIG_SYSINFO is not set # # System reset device drivers # # CONFIG_SYSRESET is not set # CONFIG_TEE is not set # CONFIG_DM_THERMAL is not set # # Timer Support # CONFIG_TIMER=y # CONFIG_TIMER_EARLY is not set # CONFIG_ALTERA_TIMER is not set # CONFIG_AST_TIMER is not set # CONFIG_ATCPIT100_TIMER is not set # CONFIG_ATMEL_PIT_TIMER is not set # CONFIG_CADENCE_TTC_TIMER is not set # CONFIG_DESIGNWARE_APB_TIMER is not set # CONFIG_MPC83XX_TIMER is not set # CONFIG_RENESAS_OSTM_TIMER is not set # CONFIG_NOMADIK_MTU_TIMER is not set # CONFIG_NPCM_TIMER is not set # CONFIG_OMAP_TIMER is not set # CONFIG_ROCKCHIP_TIMER is not set # CONFIG_STI_TIMER is not set # CONFIG_STM32_TIMER is not set # CONFIG_MTK_TIMER is not set # CONFIG_MCHP_PIT64B_TIMER is not set # CONFIG_IMX_GPT_TIMER is not set # # TPM support # # CONFIG_USB is not set # # UFS Host Controller Support # # CONFIG_TI_J721E_UFS is not set # # Graphics support # # CONFIG_DM_VIDEO is not set # CONFIG_SYS_WHITE_ON_BLACK is not set # CONFIG_NO_FB_CLEAR is not set # # TrueType Fonts # # CONFIG_VIDEO_VESA is not set # CONFIG_VIDEO_LCD_ANX9804 is not set # CONFIG_ATMEL_LCD_BGR555 is not set # CONFIG_VIDEO_BCM2835 is not set # CONFIG_VIDEO_LCD_SSD2828 is not set # CONFIG_VIDEO_LCD_HITACHI_TX18D42VM is not set # CONFIG_VIDEO_MVEBU is not set # CONFIG_I2C_EDID is not set # CONFIG_DISPLAY is not set # CONFIG_ATMEL_HLCD is not set # CONFIG_AM335X_LCD is not set # CONFIG_VIDEO_TEGRA20 is not set # CONFIG_VIDEO_BRIDGE is not set # CONFIG_VIDEO is not set # CONFIG_LCD is not set # CONFIG_VIDEO_SIMPLE is not set # CONFIG_VIDEO_DT_SIMPLEFB is not set # CONFIG_OSD is not set # CONFIG_SPLASH_SCREEN is not set # CONFIG_VIDEO_VCXK is not set # # VirtIO Drivers # # CONFIG_VIRTIO_MMIO is not set # # 1-Wire support # # CONFIG_W1 is not set # # 1-wire EEPROM support # # CONFIG_W1_EEPROM is not set # # Watchdog Timer Support # CONFIG_WATCHDOG=y CONFIG_WATCHDOG_AUTOSTART=y CONFIG_WATCHDOG_TIMEOUT_MSECS=60000 # CONFIG_IMX_WATCHDOG is not set # CONFIG_ULP_WATCHDOG is not set # CONFIG_DESIGNWARE_WATCHDOG is not set CONFIG_WDT=y # CONFIG_WDT_APPLE is not set # CONFIG_WDT_ASPEED is not set # CONFIG_WDT_AST2600 is not set # CONFIG_WDT_AT91 is not set # CONFIG_WDT_CDNS is not set # CONFIG_WDT_CORTINA is not set # CONFIG_WDT_GPIO is not set # CONFIG_WDT_MAX6370 is not set # CONFIG_WDT_ORION is not set # CONFIG_WDT_SBSA is not set # CONFIG_WDT_SP805 is not set # CONFIG_WDT_STM32MP is not set # CONFIG_XILINX_TB_WATCHDOG is not set # CONFIG_PVBLOCK is not set # CONFIG_PHYS_TO_BUS is not set # # File systems # # CONFIG_FS_BTRFS is not set # CONFIG_FS_CBFS is not set # CONFIG_SPL_FS_CBFS is not set # CONFIG_FS_EXT4 is not set # CONFIG_FS_FAT is not set # CONFIG_FS_JFFS2 is not set # CONFIG_UBIFS_SILENCE_MSG is not set # CONFIG_FS_CRAMFS is not set # CONFIG_YAFFS2 is not set # CONFIG_FS_SQUASHFS is not set # CONFIG_FS_EROFS is not set # # Library routines # # CONFIG_ADDR_MAP is not set # CONFIG_PHYSMEM is not set # CONFIG_BCH is not set # CONFIG_CC_OPTIMIZE_LIBS_FOR_SPEED is not set CONFIG_CHARSET=y # CONFIG_DYNAMIC_CRC_TABLE is not set CONFIG_HAVE_PRIVATE_LIBGCC=y CONFIG_PRINTF=y CONFIG_SPRINTF=y CONFIG_STRTO=y CONFIG_USE_PRIVATE_LIBGCC=y CONFIG_SYS_HZ=1000 # CONFIG_PANIC_HANG is not set # CONFIG_REGEX is not set CONFIG_LIB_RAND=y # CONFIG_LIB_HW_RAND is not set CONFIG_SUPPORT_ACPI=y # CONFIG_GENERATE_ACPI_TABLE is not set # CONFIG_SPL_TINY_MEMSET is not set # CONFIG_TPL_TINY_MEMSET is not set # CONFIG_BITREVERSE is not set # CONFIG_TRACE is not set # CONFIG_CIRCBUF is not set # CONFIG_CMD_DHRYSTONE is not set # # Security support # # CONFIG_AES is not set # CONFIG_ECDSA is not set # CONFIG_RSA is not set # CONFIG_TPM is not set # # Android Verified Boot # # # Hashing Support # # CONFIG_BLAKE2 is not set # CONFIG_SHA1 is not set # CONFIG_SHA256 is not set # CONFIG_SHA512 is not set # CONFIG_SHA384 is not set # CONFIG_SHA_HW_ACCEL is not set # CONFIG_MD5 is not set CONFIG_CRC32=y # # Compression Support # # CONFIG_LZ4 is not set # CONFIG_LZMA is not set # CONFIG_LZO is not set # CONFIG_GZIP is not set # CONFIG_ZLIB_UNCOMPRESS is not set # CONFIG_BZIP2 is not set CONFIG_ZLIB=y # CONFIG_ZSTD is not set # CONFIG_SPL_LZ4 is not set # CONFIG_SPL_LZMA is not set # CONFIG_VPL_LZMA is not set # CONFIG_SPL_LZO is not set # CONFIG_SPL_GZIP is not set # CONFIG_SPL_ZSTD is not set # CONFIG_ERRNO_STR is not set CONFIG_HEXDUMP=y # CONFIG_GETOPT is not set CONFIG_OF_LIBFDT=y CONFIG_OF_LIBFDT_ASSUME_MASK=0 CONFIG_OF_LIBFDT_OVERLAY=y # CONFIG_VPL_OF_LIBFDT is not set # CONFIG_FDT_FIXUP_PARTITIONS is not set # # System tables # # CONFIG_LIB_RATIONAL is not set # CONFIG_SMBIOS_PARSER is not set # CONFIG_EFI_LOADER is not set # CONFIG_OPTEE_LIB is not set # CONFIG_OPTEE_IMAGE is not set # CONFIG_BOOTM_OPTEE is not set # CONFIG_TEST_FDTDEC is not set # CONFIG_PHANDLE_CHECK_SEQ is not set # CONFIG_UNIT_TEST is not set # CONFIG_SPL_UNIT_TEST is not set # # Tools options # CONFIG_MKIMAGE_DTC_PATH="dtc" # CONFIG_TOOLS_MKEFICAPSULE is not set 根据以上代码,其中,CONFIG_ENV_OFFSET_REDUND=0x280000表示什么?

filetype

import os import cv2 import numpy as np import psutil import time import argparse import json from datetime import datetime import logging import signal import sys import traceback import threading import GPUtil import subprocess import gc import shutil import queue import concurrent.futures import tracemalloc import platform import requests import zipfile class VideoProcessor: def __init__(self, config): self.config = config self.canceled = False self.start_time = time.time() self.frame_counter = 0 self.progress = 0 self.status = "就绪" self.fps = 0.0 self.mem_usage = 0.0 self.cpu_percent = 0.0 self.system_mem_percent = 0.0 self.system_mem_used = 0.0 self.system_mem_available = 0.0 self.gpu_load = 0.0 self.gpu_memory_used = 0.0 self.gpu_memory_total = 0.0 self.logger = logging.getLogger("VideoProcessor") self.resources = [] # 跟踪需要释放的资源 self.monitor_active = False self.monitor_thread = None # 多线程队列 self.frame_queue = queue.Queue(maxsize=self.config.get('queue_size', 30)) self.processed_queue = queue.Queue(maxsize=self.config.get('queue_size', 30)) # CUDA流管理 self.cuda_streams = [] self.cuda_ctx = None # 检测移动环境 self.is_mobile = self.detect_mobile_environment() if self.is_mobile: self.logger.info("检测到移动环境,启用移动端优化配置") # 内存跟踪 if self.config.get('enable_memory_monitor', False): tracemalloc.start() self.logger.info("内存跟踪已启用") # 注册信号处理 signal.signal(signal.SIGINT, self.signal_handler) signal.signal(signal.SIGTERM, self.signal_handler) def detect_mobile_environment(self): """检测是否在移动环境中运行""" try: system = platform.system().lower() uname = os.uname() # Android检测 if 'linux' in system and 'android' in uname.version.lower(): self.logger.info("检测到Android环境") return True # iOS检测 if system == 'darwin' and 'ios' in uname.machine.lower(): self.logger.info("检测到iOS环境") return True return False except Exception as e: self.logger.warning(f"移动环境检测失败: {str(e)}") return False def signal_handler(self, signum, frame): """处理中断信号""" self.logger.warning(f"接收到中断信号: {signum}, 正在优雅地停止...") self.cancel() sys.exit(1) def start_resource_monitor(self, interval=1): """启动资源监控线程""" self.monitor_active = True self.monitor_thread = threading.Thread( target=self.monitor_resources, args=(interval,), daemon=True ) self.monitor_thread.start() self.logger.info("资源监控线程已启动") def stop_resource_monitor(self): """停止资源监控线程""" if self.monitor_thread and self.monitor_thread.is_alive(): self.monitor_active = False self.monitor_thread.join(timeout=2.0) self.logger.info("资源监控线程已停止") def monitor_resources(self, interval=1): """资源监控线程函数""" self.logger.info("资源监控开始") print("\n资源监控 | 时间戳 | CPU使用率 | 内存使用 | GPU使用率 | GPU显存") print("-" * 70) while self.monitor_active: try: # CPU监控 cpu_percent = psutil.cpu_percent(interval=None) # 内存监控 mem = psutil.virtual_memory() mem_usage = f"{mem.used / (1024**3):.1f}GB/{mem.total / (1024**3):.1f}GB" # GPU监控 gpu_info = "" try: gpus = GPUtil.getGPUs() if gpus: gpu = gpus[0] gpu_info = f"{gpu.load*100:.1f}% | {gpu.memoryUsed:.1f}MB/{gpu.memoryTotal:.0f}MB" # 更新GPU状态 self.gpu_load = gpu.load * 100 self.gpu_memory_used = gpu.memoryUsed self.gpu_memory_total = gpu.memoryTotal else: gpu_info = "No GPU" except Exception as e: gpu_info = f"Error: {str(e)}" timestamp = time.strftime('%H:%M:%S') print(f"{timestamp} | {cpu_percent:6.1f}% | {mem_usage:^15} | {gpu_info}") self.logger.info(f"资源监控 | {timestamp} | CPU: {cpu_percent}% | 内存: {mem_usage} | GPU: {gpu_info}") # 内存泄漏检测 if self.config.get('enable_memory_monitor', False): snapshot = tracemalloc.take_snapshot() top_stats = snapshot.statistics('lineno') self.logger.info("内存分配Top 10:") for stat in top_stats[:10]: self.logger.info(str(stat)) time.sleep(interval) except Exception as e: self.logger.error(f"资源监控出错: {str(e)}") time.sleep(5) # 出错后等待5秒再重试 def init_cuda(self): """初始化CUDA环境""" if not self.config.get('use_gpu_processing', False) or self.is_mobile: return try: device_id = self.config.get('gpu_device_index', 0) if cv2.cuda.getCudaEnabledDeviceCount() > device_id: # 设置CUDA设备 cv2.cuda.setDevice(device_id) device = cv2.cuda.DeviceInfo(device_id) self.logger.info(f"使用GPU设备: {device.name()}") # 创建CUDA流 num_streams = self.config.get('cuda_streams', 4) self.cuda_streams = [cv2.cuda_Stream() for _ in range(num_streams)] self.logger.info(f"已创建 {num_streams} 个CUDA流") # 创建CUDA上下文 self.cuda_ctx = cv2.cuda.Device(device_id).createContext() self.logger.info("CUDA上下文已创建") else: self.logger.warning("请求的GPU设备不可用,将使用CPU处理") self.config['use_gpu_processing'] = False except Exception as e: self.logger.error(f"CUDA初始化失败: {str(e)}") self.config['use_gpu_processing'] = False def open_video_with_acceleration(self, file_path): """使用硬件加速打开视频""" # 移动端使用专用API if self.is_mobile: self.logger.info("移动端: 使用Android专用API") try: # Android专用API cap = cv2.VideoCapture(file_path, cv2.CAP_ANDROID) if cap.isOpened(): self.logger.info("Android专用API打开成功") self.resources.append(cap) return cap else: self.logger.warning("Android专用API打开失败,尝试默认方式") except: self.logger.warning("Android专用API不可用,使用默认方式") # 桌面端或移动端备选方案 if self.config.get('hardware_acceleration', 'disable') == 'disable': cap = cv2.VideoCapture(file_path) self.resources.append(cap) return cap cap = cv2.VideoCapture() self.resources.append(cap) acceleration = { 'auto': cv2.VIDEO_ACCELERATION_ANY, 'any': cv2.VIDEO_ACCELERATION_ANY, 'nvidia': cv2.VIDEO_ACCELERATION_NVIDIA, 'intel': cv2.VIDEO_ACCELERATION_INTEL, 'vaapi': cv2.VIDEO_ACCELERATION_VAAPI }.get(self.config.get('hardware_acceleration', 'auto'), cv2.VIDEO_ACCELERATION_ANY) params = [ cv2.CAP_PROP_HW_ACCELERATION, acceleration, cv2.CAP_PROP_HW_DEVICE, self.config.get('gpu_device_index', 0) ] # 降低延迟的优化参数 if self.config.get('reduce_latency', True): params.extend([ cv2.CAP_PROP_BUFFERSIZE, self.config.get('buffer_size', 3), cv2.CAP_PROP_FPS, self.config.get('target_fps', 30) ]) # MJPEG压缩 if self.config.get('use_mjpeg', True): params.extend([ cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M','J','P','G') ]) # 设置解码线程数 decoding_threads = self.config.get('decoding_threads', 0) if decoding_threads > 0: params.extend([cv2.CAP_PROP_FFMPEG_THREADS, decoding_threads]) try: cap.open(file_path, apiPreference=cv2.CAP_FFMPEG, params=params) # Intel专用加速 if self.config.get('hardware_acceleration', '') == 'intel' and cap.isOpened(): cap.set(cv2.CAP_PROP_INTEL_VIDEO_SRC_HW_ACCEL, 1) except Exception as e: self.logger.error(f"硬件加速打开失败: {str(e)}, 使用默认方式") cap = cv2.VideoCapture(file_path) return cap def update_system_stats(self): """更新系统资源统计""" self.cpu_percent = psutil.cpu_percent(interval=0.1) mem = psutil.virtual_memory() self.system_mem_percent = mem.percent self.system_mem_used = mem.used / (1024 ** 3) # GB self.system_mem_available = mem.available / (1024 ** 3) # GB def print_progress(self): """美观的进度显示""" elapsed = time.time() - self.start_time eta = (100 - self.progress) * elapsed / max(1, self.progress) if self.progress > 0 else 0 # 进度条 bar_length = 30 filled_length = int(bar_length * self.progress / 100) bar = '█' * filled_length + '-' * (bar_length - filled_length) # 队列状态 queue_status = f"Q: {self.frame_queue.qsize()}/{self.processed_queue.qsize()}" progress_str = ( f"进度: |{bar}| {self.progress}% " f"| 速度: {self.fps:.1f}fps " f"| 用时: {elapsed:.1f}s " f"| 剩余: {eta:.1f}s " f"| CPU: {self.cpu_percent:.0f}% " f"| 内存: {self.mem_usage:.1f}MB " f"| GPU: {self.gpu_load:.1f}% " f"| {queue_status}" ) print(f"\r{progress_str}", end="") self.logger.info(progress_str) def capture_thread(self, cap, total_frames): """视频捕获线程 (生产者)""" frame_idx = 0 while cap.isOpened() and not self.canceled and frame_idx < total_frames: ret, frame = cap.read() if not ret: break # 放入队列,非阻塞方式防止死锁 try: self.frame_queue.put((frame_idx, frame), timeout=1.0) frame_idx += 1 except queue.Full: if self.canceled: break time.sleep(0.01) # 发送结束信号 self.frame_queue.put((None, None)) self.logger.info(f"捕获线程完成,共捕获 {frame_idx} 帧") def processing_thread(self, output_resolution): """视频处理线程 (消费者)""" output_width, output_height = output_resolution while not self.canceled: try: # 获取帧,带超时防止死锁 frame_idx, frame = self.frame_queue.get(timeout=2.0) # 结束信号 if frame_idx is None: self.processed_queue.put((None, None)) self.frame_queue.task_done() break # 处理帧 try: # 移动端使用轻量级算法 if self.is_mobile: # 移动端优化:使用Canny边缘检测替代复杂特征检测 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) edges = cv2.Canny(gray, 100, 200) # 将边缘检测结果与原帧合并 frame[:, :, 0] = np.minimum(frame[:, :, 0] + edges, 255) frame[:, :, 1] = np.minimum(frame[:, :, 1] + edges, 255) frame[:, :, 2] = np.minimum(frame[:, :, 2] + edges, 255) # 移动端使用快速插值方法 processed_frame = cv2.resize(frame, output_resolution, interpolation=cv2.INTER_LINEAR) else: # 桌面端使用完整算法 if self.config.get('use_gpu_processing', False) and self.cuda_streams: # 选择CUDA流 (轮询) stream_idx = frame_idx % len(self.cuda_streams) stream = self.cuda_streams[stream_idx] # 上传到GPU gpu_frame = cv2.cuda_GpuMat() gpu_frame.upload(frame, stream=stream) # GPU处理 if output_resolution: gpu_frame = cv2.cuda.resize(gpu_frame, output_resolution, stream=stream) # 下载回CPU processed_frame = gpu_frame.download(stream=stream) else: # CPU处理 if output_resolution: processed_frame = cv2.resize(frame, output_resolution) else: processed_frame = frame # 放入已处理队列 self.processed_queue.put((frame_idx, processed_frame), timeout=1.0) except cv2.error as e: if 'CUDA' in str(e): self.logger.error(f"GPU处理失败: {str(e)},切换到CPU模式") self.config['use_gpu_processing'] = False # 使用CPU重试 processed_frame = cv2.resize(frame, output_resolution) if output_resolution else frame self.processed_queue.put((frame_idx, processed_frame), timeout=1.0) else: self.logger.error(f"处理帧 {frame_idx} 失败: {str(e)}") except Exception as e: self.logger.error(f"处理帧 {frame_idx} 时出错: {str(e)}") self.frame_queue.task_done() except queue.Empty: if self.canceled: break except Exception as e: self.logger.error(f"处理线程出错: {str(e)}") self.logger.info("处理线程退出") def writer_thread(self, out, total_frames): """写入线程""" frame_idx = 0 last_log_time = time.time() while not self.canceled and frame_idx < total_frames: try: # 获取已处理帧 idx, processed_frame = self.processed_queue.get(timeout=2.0) # 结束信号 if idx is None: break # 写入输出 if processed_frame is not None: out.write(processed_frame) # 更新计数 self.frame_counter += 1 frame_idx += 1 # 计算帧率 elapsed = time.time() - self.start_time self.fps = self.frame_counter / elapsed if elapsed > 0 else 0 # 更新内存使用 process = psutil.Process(os.getpid()) self.mem_usage = process.memory_info().rss / (1024 ** 2) # MB # 更新系统状态 self.update_system_stats() # 更新进度 self.progress = int(frame_idx * 100 / total_frames) # 定期打印进度 current_time = time.time() if current_time - last_log_time > 1.0 or frame_idx % 50 == 0: self.print_progress() last_log_time = current_time # 内存管理 if frame_idx % 100 == 0: gc.collect() # 检查内存使用情况 if self.system_mem_percent > 90: self.logger.warning(f"系统内存使用超过90%! (当前: {self.system_mem_percent}%)") print(f"\n警告: 系统内存使用过高 ({self.system_mem_percent}%)") self.processed_queue.task_done() except queue.Empty: if self.canceled: break except Exception as e: self.logger.error(f"写入线程出错: {str(e)}") self.logger.info(f"写入线程完成,共写入 {frame_idx} 帧") def run(self): try: self.status = "处理中..." self.logger.info("视频处理开始") self.logger.info(f"主视频: {self.config['main_video']}") self.logger.info(f"副视频: {self.config['sub_video']}") self.logger.info(f"输出文件: {self.config['output_path']}") self.start_time = time.time() # 初始化CUDA self.init_cuda() # 启动资源监控 self.start_resource_monitor() # 打开主视频 self.logger.info("正在打开主视频...") main_cap = self.open_video_with_acceleration(self.config['main_video']) if not main_cap.isOpened(): self.status = "无法打开主视频文件!" self.logger.error(f"无法打开主视频文件: {self.config['main_video']}") return False # 获取主视频信息 main_fps = main_cap.get(cv2.CAP_PROP_FPS) main_width = int(main_cap.get(cv2.CAP_PROP_FRAME_WIDTH)) main_height = int(main_cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) main_total_frames = int(main_cap.get(cv2.CAP_PROP_FRAME_COUNT)) self.logger.info(f"主视频信息: {main_width}x{main_height}@{main_fps:.1f}fps, 总帧数: {main_total_frames}") # 打开副视频 self.logger.info("正在打开副视频...") sub_cap = self.open_video_with_acceleration(self.config['sub_video']) if not sub_cap.isOpened(): self.status = "无法打开副视频文件!" self.logger.error(f"无法打开副视频文件: {self.config['sub_video']}") return False # 获取副视频信息 sub_fps = sub_cap.get(cv2.CAP_PROP_FPS) sub_width = int(sub_cap.get(cv2.CAP_PROP_FRAME_WIDTH)) sub_height = int(sub_cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) sub_total_frames = int(sub_cap.get(cv2.CAP_PROP_FRAME_COUNT)) self.logger.info(f"副视频信息: {sub_width}x{sub_height}@{sub_fps:.1f}fps, 总帧数: {sub_total_frames}") # 创建输出目录 output_dir = os.path.dirname(self.config['output_path']) if output_dir and not os.path.exists(output_dir): try: os.makedirs(output_dir) self.logger.info(f"已创建输出目录: {output_dir}") except Exception as e: self.status = f"无法创建输出目录: {output_dir}" self.logger.error(f"创建输出目录失败: {str(e)}") return False # 创建输出视频 output_width, output_height = self.config['output_resolution'] fourcc = cv2.VideoWriter_fourcc(*'mp4v') out = cv2.VideoWriter(self.config['output_path'], fourcc, main_fps, (output_width, output_height)) self.resources.append(out) if not out.isOpened(): self.status = "无法创建输出视频文件!请检查分辨率设置。" self.logger.error(f"无法创建输出视频: {self.config['output_path']}, 分辨率: {output_width}x{output_height}") return False # 计算主视频分段参数 if self.config['main_segment_type'] == '秒': segment_length_main = int(float(self.config['segment_a']) * main_fps) else: segment_length_main = int(self.config['segment_a']) b1 = int(self.config['b1']) b2 = int(self.config['b2']) replace_frame_count = b2 - b1 + 1 # 计算副视频分段参数 if self.config['sub_segment_type'] == '秒': segment_length_sub = int(float(self.config['segment_c']) * sub_fps) else: segment_length_sub = int(self.config['segment_c']) d = int(self.config['d']) # 计算主视频段数 segments_main = (main_total_frames + segment_length_main - 1) // segment_length_main # 计算副视频段数 segments_sub = (sub_total_frames + segment_length_sub - 1) // segment_length_sub # 检查段数是否匹配 if segments_main > segments_sub: if self.config['sub_option'] == '循环使用': self.logger.warning(f"副视频段数不足({segments_sub}),将循环使用以满足主视频段数({segments_main})") else: self.status = "副视频段数不足,无法完成替换!" self.logger.error(f"副视频段数不足: {segments_sub} < {segments_main}") return False # 初始化性能监控 process = psutil.Process(os.getpid()) self.logger.info("="*50) self.logger.info("开始视频处理") self.logger.info(f"主视频: {self.config['main_video']} ({main_total_frames}帧, {main_fps:.1f}fps)") self.logger.info(f"副视频: {self.config['sub_video']} ({sub_total_frames}帧, {sub_fps:.1f}fps)") self.logger.info(f"输出文件: {self.config['output_path']}") self.logger.info(f"分辨率: {output_width}x{output_height}") self.logger.info(f"主视频分段数: {segments_main}, 每段{segment_length_main}帧") self.logger.info(f"替换帧范围: {b1}-{b2} (每段替换{replace_frame_count}帧)") self.logger.info(f"副视频分段数: {segments_sub}, 每段{segment_length_sub}帧") self.logger.info(f"副视频起始帧: {d}") self.logger.info(f"使用GPU处理: {self.config.get('use_gpu_processing', False)}") self.logger.info(f"CUDA流数量: {len(self.cuda_streams)}") self.logger.info(f"移动环境: {self.is_mobile}") self.logger.info("="*50) print("\n" + "="*50) print("开始视频处理") print(f"主视频: {self.config['main_video']} ({main_total_frames}帧, {main_fps:.1f}fps)") print(f"副视频: {self.config['sub_video']} ({sub_total_frames}帧, {sub_fps:.1f}fps)") print(f"输出文件: {self.config['output_path']}") print(f"分辨率: {output_width}x{output_height}") print(f"主视频分段数: {segments_main}, 每段{segment_length_main}帧") print(f"替换帧范围: {b1}-{b2} (每段替换{replace_frame_count}帧)") print(f"副视频分段数: {segments_sub}, 每段{segment_length_sub}帧") print(f"副视频起始帧: {d}") print(f"使用GPU处理: {self.config.get('use_gpu_processing', False)}") print(f"CUDA流数量: {len(self.cuda_streams)}") print(f"移动环境: {self.is_mobile}") print("="*50 + "\n") # 启动多线程处理 with concurrent.futures.ThreadPoolExecutor(max_workers=3) as executor: # 启动捕获线程 capture_future = executor.submit( self.capture_thread, main_cap, main_total_frames ) # 启动处理线程 processing_future = executor.submit( self.processing_thread, (output_width, output_height) ) # 启动写入线程 writer_future = executor.submit( self.writer_thread, out, main_total_frames ) # 等待所有线程完成 concurrent.futures.wait( [capture_future, processing_future, writer_future], return_when=concurrent.futures.ALL_COMPLETED ) if not self.canceled: self.status = "处理完成" self.progress = 100 self.print_progress() print(f"\n\n处理完成!输出文件: {self.config['output_path']}") self.logger.info(f"处理完成! 总帧数: {self.frame_counter}, 耗时: {time.time() - self.start_time:.1f}秒") self.logger.info(f"输出文件: {self.config['output_path']}") return True return False except Exception as e: self.status = f"处理过程中发生错误: {str(e)}" error_trace = traceback.format_exc() self.logger.error(f"处理过程中发生错误: {str(e)}") self.logger.error(f"错误详情:\n{error_trace}") print(f"\n\n错误: {str(e)}") return False finally: self.stop_resource_monitor() self.release_resources() if self.config.get('enable_memory_monitor', False): tracemalloc.stop() def release_resources(self): """释放所有资源""" self.logger.info("正在释放资源...") for resource in self.resources: try: if hasattr(resource, 'release'): resource.release() elif hasattr(resource, 'close'): resource.close() except Exception as e: self.logger.warning(f"释放资源时出错: {str(e)}") # 释放CUDA资源 if self.cuda_ctx: try: self.cuda_ctx.destroy() self.logger.info("CUDA上下文已释放") except Exception as e: self.logger.warning(f"释放CUDA上下文时出错: {str(e)}") self.resources = [] self.logger.info("资源已释放") def cancel(self): """取消处理""" self.canceled = True self.status = "正在取消..." self.logger.warning("用户请求取消处理") print("\n正在取消处理...") # 清空队列 while not self.frame_queue.empty(): try: self.frame_queue.get_nowait() self.frame_queue.task_done() except queue.Empty: break while not self.processed_queue.empty(): try: self.processed_queue.get_nowait() self.processed_queue.task_done() except queue.Empty: break self.stop_resource_monitor() self.release_resources() def get_video_info(file_path): """获取视频文件信息""" cap = None try: cap = cv2.VideoCapture(file_path) if cap.isOpened(): width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) fps = cap.get(cv2.CAP_PROP_FPS) frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) duration = frame_count / fps if fps > 0 else 0 return { "width": width, "height": height, "fps": fps, "frame_count": frame_count, "duration": duration } return None except Exception as e: print(f"获取视频信息时出错: {str(e)}") return None finally: if cap and cap.isOpened(): cap.release() def validate_config(config): """验证配置参数""" # 检查文件存在 if not os.path.exists(config['main_video']): print(f"错误: 主视频文件不存在 - {config['main_video']}") return False if not os.path.exists(config['sub_video']): print(f"错误: 副视频文件不存在 - {config['sub_video']}") return False # 检查输出目录 output_dir = os.path.dirname(config['output_path']) if output_dir and not os.path.exists(output_dir): try: os.makedirs(output_dir) print(f"已创建输出目录: {output_dir}") except: print(f"错误: 无法创建输出目录 - {output_dir}") return False # 检查参数有效性 try: # 主视频参数 segment_a = float(config['segment_a']) if segment_a <= 0: print("错误: 分段长度必须大于0!") return False b1 = int(config['b1']) b2 = int(config['b2']) if b1 < 0 or b2 < 0: print("错误: 帧索引不能为负数!") return False if b1 > b2: print("错误: 替换开始帧(b1)必须小于或等于替换结束帧(b2)!") return False # 副视频参数 segment_c = float(config['segment_c']) if segment_c <= 0: print("错误: 分段长度必须大于0!") return False d = int(config['d']) if d < 0: print("错误: 帧索引不能为负数!") return False # 分辨率 width = int(config['output_resolution'][0]) height = int(config['output_resolution'][1]) if width <= 0 or height <= 0: print("错误: 分辨率必须大于0!") return False return True except ValueError: print("错误: 请输入有效的数字参数!") return False def save_config(config, file_path): """保存配置到文件""" try: with open(file_path, 'w') as f: json.dump(config, f, indent=2) print(f"配置已保存到: {file_path}") except Exception as e: print(f"保存配置时出错: {str(e)}") def load_config(file_path): """从文件加载配置""" try: with open(file_path, 'r') as f: config = json.load(f) # 确保配置中包含所有必要字段 required_keys = [ 'main_video', 'sub_video', 'output_path', 'main_segment_type', 'segment_a', 'b1', 'b2', 'sub_segment_type', 'segment_c', 'd', 'sub_option', 'output_resolution' ] for key in required_keys: if key not in config: print(f"警告: 配置文件中缺少 '{key}' 参数") return config except FileNotFoundError: print(f"错误: 配置文件不存在 - {file_path}") except Exception as e: print(f"加载配置时出错: {str(e)}") return None def create_default_config(): """创建默认配置""" return { "main_video": "main_video.mp4", "sub_video": "sub_video.mp4", "output_path": "output/output_video.mp4", "main_segment_type": "秒", # 默认按秒分段 "segment_a": "1", # 默认1秒 "b1": "1", # 默认替换开始帧 "b2": "1", # 默认替换结束帧 "sub_segment_type": "帧", # 默认按帧分段 "segment_c": "1", # 默认1帧 "d": "1", # 默认起始帧 "sub_option": "循环使用", "output_resolution": [1280, 720], "hardware_acceleration": "auto", "gpu_device_index": 0, "reduce_latency": True, "decoding_threads": 4, "use_gpu_processing": True, "cuda_streams": 4, "queue_size": 30, "buffer_size": 3, "target_fps": 30, "use_mjpeg": True, "enable_memory_monitor": False, "mobile_optimized": True # 新增移动端优化标志 } def detect_hardware_acceleration(): """更全面的硬件加速支持检测""" print("\n=== 硬件加速支持检测 ===") print(f"OpenCV版本: {cv2.__version__}") # 检测CUDA支持 if cv2.cuda.getCudaEnabledDeviceCount() > 0: print("CUDA支持: 可用") for i in range(cv2.cuda.getCudaEnabledDeviceCount()): try: device = cv2.cuda.getDevice(i) print(f" 设备 {i}: {device.name()}, 计算能力: {device.majorVersion()}.{device.minorVersion()}") except: print(f" 设备 {i}: 信息获取失败") else: print("CUDA支持: 不可用") # 检测OpenCL支持 print(f"OpenCL支持: {'可用' if cv2.ocl.haveOpenCL() else '不可用'}") # 获取FFMPEG信息 try: result = subprocess.run(['ffmpeg', '-version'], capture_output=True, text=True) ffmpeg_version = result.stdout.split('\n')[0] print(f"FFMPEG版本: {ffmpeg_version}") except: print("FFMPEG版本: 未找到") # 检测可用加速类型 acceleration_types = { 'NVIDIA': cv2.VIDEO_ACCELERATION_NVIDIA, 'Intel': cv2.VIDEO_ACCELERATION_INTEL, 'VAAPI': cv2.VIDEO_ACCELERATION_VAAPI, 'ANY': cv2.VIDEO_ACCELERATION_ANY } print("\n支持的硬件加速类型:") available_accelerations = [] for name, accel_type in acceleration_types.items(): cap = cv2.VideoCapture() try: params = [cv2.CAP_PROP_HW_ACCELERATION, accel_type] test_result = cap.open("", apiPreference=cv2.CAP_FFMPEG, params=params) status = "可用" if test_result else "不可用" print(f"- {name}: {status}") if test_result: available_accelerations.append(name.lower()) except: print(f"- {name}: 检测失败") finally: if cap.isOpened(): cap.release() # 如果没有可用的硬件加速,提供备选方案 if not available_accelerations: print("\n警告: 未检测到任何硬件加速支持!") print("建议:") print("1. 使用软件解码 (设置 hardware_acceleration: 'disable')") print("2. 安装以下备选库:") print(" - NVIDIA GPU 用户: 安装 CUDA Toolkit 和 cuDNN") print(" - Intel GPU 用户: 安装 Intel Media SDK") print(" - AMD/其他 GPU 用户: 安装 VAAPI") print("3. 重新编译OpenCV以支持硬件加速") print("4. 使用支持硬件加速的FFmpeg版本") else: print("\n检测到以下可用的硬件加速类型:") print(", ".join(available_accelerations)) print("在配置文件中设置 'hardware_acceleration' 参数使用") def preview_frame(config, frame_index, is_main=True): """预览指定视频的指定帧""" video_path = config['main_video'] if is_main else config['sub_video'] cap = cv2.VideoCapture(video_path) if not cap.isOpened(): print(f"无法打开视频文件: {video_path}") return total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) if frame_index >= total_frames: print(f"帧索引超出范围 (最大: {total_frames-1})") cap.release() return cap.set(cv2.CAP_PROP_POS_FRAMES, frame_index) ret, frame = cap.read() if ret: # 创建预览窗口 window_name = f"预览: {'主视频' if is_main else '副视频'} - 帧 {frame_index}" cv2.namedWindow(window_name, cv2.WINDOW_NORMAL) # 调整窗口大小 height, width = frame.shape[:2] max_height = 800 if height > max_height: scale = max_height / height frame = cv2.resize(frame, (int(width * scale), max_height)) cv2.imshow(window_name, frame) cv2.waitKey(0) cv2.destroyAllWindows() else: print(f"无法读取帧 {frame_index}") cap.release() def batch_process(config_file, output_dir): """批量处理多个配置""" try: with open(config_file) as f: batch_configs = json.load(f) except Exception as e: print(f"加载批量配置文件失败: {str(e)}") return total_tasks = len(batch_configs) print(f"\n开始批量处理 {total_tasks} 个任务") for i, config in enumerate(batch_configs): print(f"\n处理任务 {i+1}/{total_tasks}") print(f"主视频: {config['main_video']}") print(f"副视频: {config['sub_video']}") # 添加时间戳到输出文件名 timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") base_name = os.path.basename(config['output_path']) config['output_path'] = os.path.join( output_dir, f"{timestamp}_{base_name}" ) # 验证配置 if not validate_config(config): print(f"任务 {i+1} 配置验证失败,跳过") continue # 创建处理器 processor = VideoProcessor(config) success = processor.run() if success: print(f"任务 {i+1} 完成: {config['output_path']}") else: print(f"任务 {i+1} 失败") # 任务间延迟,让系统冷却 if i < total_tasks - 1: print("\n等待5秒,准备下一个任务...") time.sleep(5) def setup_logging(): """配置日志系统""" log_dir = "logs" if not os.path.exists(log_dir): os.makedirs(log_dir) timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") log_file = os.path.join(log_dir, f"video_processor_{timestamp}.log") logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', handlers=[ logging.FileHandler(log_file), logging.StreamHandler() ] ) logger = logging.getLogger() logger.info(f"日志系统初始化完成, 日志文件: {log_file}") return logger, log_file def install_termux_dependencies(): """安装Termux所需的依赖""" print("正在安装Termux依赖...") commands = [ "pkg update && pkg upgrade -y", "pkg install python libjpeg-turbo libvulkan vulkan-loader-android ffmpeg -y", "pkg install vulkan-tools vulkan-validation-layers -y", "pkg install ocl-icd opencl-headers -y" ] for cmd in commands: print(f"执行: {cmd}") result = subprocess.run(cmd, shell=True) if result.returncode != 0: print(f"命令执行失败: {cmd}") return False print("Termux依赖安装完成") return True def verify_gpu_support(): """验证GPU支持情况""" print("\n验证GPU支持:") # 验证MediaCodec支持 print("\n1. MediaCodec支持:") result = subprocess.run(["ffmpeg", "-hwaccels"], capture_output=True, text=True) if "mediacodec" in result.stdout: print(" ✓ 支持MediaCodec硬件加速") else: print(" ✗ 不支持MediaCodec硬件加速") # 验证Vulkan支持 print("\n2. Vulkan支持:") try: result = subprocess.run(["vulkaninfo"], capture_output=True, text=True) if "deviceName" in result.stdout: print(" ✓ 支持Vulkan API") else: print(" ✗ 不支持Vulkan API") except FileNotFoundError: print(" ✗ vulkaninfo未安装,无法验证Vulkan支持") # 验证OpenCL支持 print("\n3. OpenCL支持:") try: result = subprocess.run(["clinfo"], capture_output=True, text=True) if "Platform Name" in result.stdout: print(" ✓ 支持OpenCL") else: print(" ✗ 不支持OpenCL") except FileNotFoundError: print(" ✗ clinfo未安装,无法验证OpenCL支持") print("\n验证完成") def setup_termux_gpu_acceleration(): """设置Termux GPU加速环境""" print("="*50) print("Termux GPU加速视频处理设置") print("="*50) # 安装基础依赖 if not install_termux_dependencies(): print("依赖安装失败,无法继续设置") return # 验证GPU支持 verify_gpu_support() # 下载并编译CLBlast print("\n编译安装CLBlast...") commands = [ "pkg install git cmake make -y", "git clone https://github.com/CNugteren/CLBlast", "cd CLBlast && mkdir build && cd build", "cmake .. -DCMAKE_INSTALL_PREFIX=$PREFIX", "make install" ] for cmd in commands: print(f"执行: {cmd}") result = subprocess.run(cmd, shell=True) if result.returncode != 0: print(f"命令执行失败: {cmd}") return print("\nGPU加速环境设置完成!") print("现在可以使用以下命令进行硬件加速视频处理:") print("ffmpeg -hwaccel mediacodec -i input.mp4 -c:v h264_mediacodec output.mp4") # 创建示例批处理脚本 with open("gpu_batch_process.sh", "w") as f: f.write("""#!/bin/bash # GPU加速批处理脚本 for f in *.mp4; do echo "处理: $f" ffmpeg -hwaccel mediacodec -i "$f" -c:v h264_mediacodec "gpu_$f" done echo "所有视频处理完成!" """) print("\n已创建批处理脚本: gpu_batch_process.sh") print("使用命令运行: bash gpu_batch_process.sh") def main(): # 设置日志 logger, log_file = setup_logging() # 创建参数解析器 parser = argparse.ArgumentParser(description="专业视频帧替换工具", formatter_class=argparse.RawTextHelpFormatter) parser.add_argument("--config", help="配置文件路径", default="") parser.add_argument("--save-config", help="保存默认配置到文件", action="store_true") parser.add_argument("--background", help="后台运行模式", action="store_true") parser.add_argument("--batch", help="批量处理模式,指定批量配置文件", default="") parser.add_argument("--preview-main", type=int, help="预览主视频指定帧", default=-1) parser.add_argument("--preview-sub", type=int, help="预览副视频指定帧", default=-1) parser.add_argument("--output-dir", help="批量处理输出目录", default="batch_output") parser.add_argument("--enable-gpu", help="启用GPU加速处理", action="store_true") parser.add_argument("--enable-mem-monitor", help="启用内存监控", action="store_true") parser.add_argument("--setup-termux", help="设置Termux GPU加速环境", action="store_true") args = parser.parse_args() # Termux GPU加速设置 if args.setup_termux: setup_termux_gpu_acceleration() return # 保存默认配置 if args.save_config: config_file = args.config if args.config else "video_config.json" default_config = create_default_config() save_config(default_config, config_file) print(f"默认配置已保存到: {config_file}") return # 批量处理模式 if args.batch: if not os.path.exists(args.output_dir): os.makedirs(args.output_dir) batch_process(args.batch, args.output_dir) return # 加载配置 config = None if args.config: config = load_config(args.config) # 如果没有提供配置或加载失败,使用默认配置 if not config: print("使用默认配置") config = create_default_config() # 命令行参数覆盖配置 if args.enable_gpu: config['use_gpu_processing'] = True if args.enable_mem_monitor: config['enable_memory_monitor'] = True # 预览功能 if args.preview_main >= 0: preview_frame(config, args.preview_main, is_main=True) return if args.preview_sub >= 0: preview_frame(config, args.preview_sub, is_main=False) return # 后台模式处理 if args.background: print("后台模式运行中...") logger.info("后台模式启动") # 重定向标准输出到日志 sys.stdout = open(log_file, 'a') sys.stderr = sys.stdout # 显示硬件加速信息 detect_hardware_acceleration() # 显示配置 logger.info("\n当前配置:") logger.info(f"主视频: {config['main_video']}") logger.info(f"副视频: {config['sub_video']}") logger.info(f"输出文件: {config['output_path']}") logger.info(f"主视频分段方式: {config['main_segment_type']}, 长度: {config['segment_a']}") logger.info(f"替换帧范围: b1={config['b1']}, b2={config['b2']}") logger.info(f"副视频分段方式: {config['sub_segment_type']}, 长度: {config['segment_c']}") logger.info(f"副视频起始帧: d={config['d']}") logger.info(f"副视频不足时: {config['sub_option']}") logger.info(f"输出分辨率: {config['output_resolution'][0]}x{config['output_resolution'][1]}") logger.info(f"硬件加速: {config.get('hardware_acceleration', 'auto')}") logger.info(f"解码线程数: {config.get('decoding_threads', 0)}") logger.info(f"使用GPU处理: {config.get('use_gpu_processing', False)}") logger.info(f"CUDA流数量: {config.get('cuda_streams', 0)}") logger.info(f"队列大小: {config.get('queue_size', 30)}") logger.info(f"启用内存监控: {config.get('enable_memory_monitor', False)}") logger.info(f"移动端优化: {config.get('mobile_optimized', True)}") print("\n当前配置:") print(f"主视频: {config['main_video']}") print(f"副视频: {config['sub_video']}") print(f"输出文件: {config['output_path']}") print(f"主视频分段方式: {config['main_segment_type']}, 长度: {config['segment_a']}") print(f"替换帧范围: b1={config['b1']}, b2={config['b2']}") print(f"副视频分段方式: {config['sub_segment_type']}, 长度: {config['segment_c']}") print(f"副视频起始帧: d={config['d']}") print(f"副视频不足时: {config['sub_option']}") print(f"输出分辨率: {config['output_resolution'][0]}x{config['output_resolution'][1]}") print(f"硬件加速: {config.get('hardware_acceleration', 'auto')}") print(f"解码线程数: {config.get('decoding_threads', 0)}") print(f"使用GPU处理: {config.get('use_gpu_processing', False)}") print(f"CUDA流数量: {config.get('cuda_streams', 0)}") print(f"队列大小: {config.get('queue_size', 30)}") print(f"启用内存监控: {config.get('enable_memory_monitor', False)}") print(f"移动端优化: {config.get('mobile_optimized', True)}\n") # 验证配置 if not validate_config(config): logger.error("配置验证失败") return # 显示视频信息 main_info = get_video_info(config['main_video']) if main_info: logger.info("主视频信息:") logger.info(f" 尺寸: {main_info['width']}x{main_info['height']}") logger.info(f" 帧率: {main_info['fps']:.1f} fps") logger.info(f" 总帧数: {main_info['frame_count']}") logger.info(f" 时长: {main_info['duration']:.1f}秒") print("主视频信息:") print(f" 尺寸: {main_info['width']}x{main_info['height']}") print(f" 帧率: {main_info['fps']:.1f} fps") print(f" 总帧数: {main_info['frame_count']}") print(f" 时长: {main_info['duration']:.1f}秒") sub_info = get_video_info(config['sub_video']) if sub_info: logger.info("\n副视频信息:") logger.info(f" 尺寸: {sub_info['width']}x{sub_info['height']}") logger.info(f" 帧率: {sub_info['fps']:.1f} fps") logger.info(f" 总帧数: {sub_info['frame_count']}") logger.info(f" 时长: {sub_info['duration']:.1f}秒") print("\n副视频信息:") print(f" 尺寸: {sub_info['width']}x{sub_info['height']}") print(f" 帧率: {sub_info['fps']:.1f} fps") print(f" 总帧数: {sub_info['frame_count']}") print(f" 时长: {sub_info['duration']:.1f}秒") # 确认开始处理 if not args.background: print("\n按 Enter 开始处理,或输入 'c' 取消...") user_input = input().strip().lower() if user_input == 'c': logger.info("用户取消处理") print("处理已取消") return # 创建并运行处理器 logger.info("开始视频处理") processor = VideoProcessor(config) processor.run() # 保存配置 timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") config_file = f"video_config_{timestamp}.json" save_config(config, config_file) logger.info(f"配置已保存: {config_file}") if __name__ == "__main__": main() 分析此代码所需依赖

filetype

/* * Copyright (c) 2020 - 2025 Renesas Electronics Corporation and/or its affiliates * * SPDX-License-Identifier: BSD-3-Clause */ /*******************************************************************************************************************//** * @ingroup RENESAS_TRANSFER_INTERFACES * @defgroup TRANSFER_API Transfer Interface * * @brief Interface for data transfer functions. * * @section TRANSFER_API_SUMMARY Summary * The transfer interface supports background data transfer (no CPU intervention). * * * @{ **********************************************************************************************************************/ #ifndef R_TRANSFER_API_H #define R_TRANSFER_API_H /*********************************************************************************************************************** * Includes **********************************************************************************************************************/ /* Common error codes and definitions. */ #include "bsp_api.h" /* Common macro for FSP header files. There is also a corresponding FSP_FOOTER macro at the end of this file. */ FSP_HEADER /********************************************************************************************************************** * Macro definitions **********************************************************************************************************************/ #define TRANSFER_SETTINGS_MODE_BITS (30U) #define TRANSFER_SETTINGS_SIZE_BITS (28U) #define TRANSFER_SETTINGS_SRC_ADDR_BITS (26U) #define TRANSFER_SETTINGS_CHAIN_MODE_BITS (22U) #define TRANSFER_SETTINGS_IRQ_BITS (21U) #define TRANSFER_SETTINGS_REPEAT_AREA_BITS (20U) #define TRANSFER_SETTINGS_DEST_ADDR_BITS (18U) /********************************************************************************************************************** * Typedef definitions **********************************************************************************************************************/ /** Transfer control block. Allocate an instance specific control block to pass into the transfer API calls. */ typedef void transfer_ctrl_t; #ifndef BSP_OVERRIDE_TRANSFER_MODE_T /** Transfer mode describes what will happen when a transfer request occurs. */ typedef enum e_transfer_mode { /** In normal mode, each transfer request causes a transfer of @ref transfer_size_t from the source pointer to * the destination pointer. The transfer length is decremented and the source and address pointers are * updated according to @ref transfer_addr_mode_t. After the transfer length reaches 0, transfer requests * will not cause any further transfers. */ TRANSFER_MODE_NORMAL = 0, /** Repeat mode is like normal mode, except that when the transfer length reaches 0, the pointer to the * repeat area and the transfer length will be reset to their initial values. If DMAC is used, the * transfer repeats only transfer_info_t::num_blocks times. After the transfer repeats * transfer_info_t::num_blocks times, transfer requests will not cause any further transfers. If DTC is * used, the transfer repeats continuously (no limit to the number of repeat transfers). */ TRANSFER_MODE_REPEAT = 1, /** In block mode, each transfer request causes transfer_info_t::length transfers of @ref transfer_size_t. * After each individual transfer, the source and destination pointers are updated according to * @ref transfer_addr_mode_t. After the block transfer is complete, transfer_info_t::num_blocks is * decremented. After the transfer_info_t::num_blocks reaches 0, transfer requests will not cause any * further transfers. */ TRANSFER_MODE_BLOCK = 2, /** In addition to block mode features, repeat-block mode supports a ring buffer of blocks and offsets * within a block (to split blocks into arrays of their first data, second data, etc.) */ TRANSFER_MODE_REPEAT_BLOCK = 3 } transfer_mode_t; #endif #ifndef BSP_OVERRIDE_TRANSFER_SIZE_T /** Transfer size specifies the size of each individual transfer. * Total transfer length = transfer_size_t * transfer_length_t */ typedef enum e_transfer_size { TRANSFER_SIZE_1_BYTE = 0, ///< Each transfer transfers a 8-bit value TRANSFER_SIZE_2_BYTE = 1, ///< Each transfer transfers a 16-bit value TRANSFER_SIZE_4_BYTE = 2, ///< Each transfer transfers a 32-bit value TRANSFER_SIZE_8_BYTE = 3 ///< Each transfer transfers a 64-bit value } transfer_size_t; #endif #ifndef BSP_OVERRIDE_TRANSFER_ADDR_MODE_T /** Address mode specifies whether to modify (increment or decrement) pointer after each transfer. */ typedef enum e_transfer_addr_mode { /** Address pointer remains fixed after each transfer. */ TRANSFER_ADDR_MODE_FIXED = 0, /** Offset is added to the address pointer after each transfer. */ TRANSFER_ADDR_MODE_OFFSET = 1, /** Address pointer is incremented by associated @ref transfer_size_t after each transfer. */ TRANSFER_ADDR_MODE_INCREMENTED = 2, /** Address pointer is decremented by associated @ref transfer_size_t after each transfer. */ TRANSFER_ADDR_MODE_DECREMENTED = 3 } transfer_addr_mode_t; #endif #ifndef BSP_OVERRIDE_TRANSFER_REPEAT_AREA_T /** Repeat area options (source or destination). In @ref TRANSFER_MODE_REPEAT, the selected pointer returns to its * original value after transfer_info_t::length transfers. In @ref TRANSFER_MODE_BLOCK and @ref TRANSFER_MODE_REPEAT_BLOCK, * the selected pointer returns to its original value after each transfer. */ typedef enum e_transfer_repeat_area { /** Destination area repeated in @ref TRANSFER_MODE_REPEAT or @ref TRANSFER_MODE_BLOCK or @ref TRANSFER_MODE_REPEAT_BLOCK. */ TRANSFER_REPEAT_AREA_DESTINATION = 0, /** Source area repeated in @ref TRANSFER_MODE_REPEAT or @ref TRANSFER_MODE_BLOCK or @ref TRANSFER_MODE_REPEAT_BLOCK. */ TRANSFER_REPEAT_AREA_SOURCE = 1 } transfer_repeat_area_t; #endif #ifndef BSP_OVERRIDE_TRANSFER_CHAIN_MODE_T /** Chain transfer mode options. * @note Only applies for DTC. */ typedef enum e_transfer_chain_mode { /** Chain mode not used. */ TRANSFER_CHAIN_MODE_DISABLED = 0, /** Switch to next transfer after a single transfer from this @ref transfer_info_t. */ TRANSFER_CHAIN_MODE_EACH = 2, /** Complete the entire transfer defined in this @ref transfer_info_t before chaining to next transfer. */ TRANSFER_CHAIN_MODE_END = 3 } transfer_chain_mode_t; #endif #ifndef BSP_OVERRIDE_TRANSFER_IRQ_T /** Interrupt options. */ typedef enum e_transfer_irq { /** Interrupt occurs only after last transfer. If this transfer is chained to a subsequent transfer, * the interrupt will occur only after subsequent chained transfer(s) are complete. * @warning DTC triggers the interrupt of the activation source. Choosing TRANSFER_IRQ_END with DTC will * prevent activation source interrupts until the transfer is complete. */ TRANSFER_IRQ_END = 0, /** Interrupt occurs after each transfer. * @note Not available in all HAL drivers. See HAL driver for details. */ TRANSFER_IRQ_EACH = 1 } transfer_irq_t; #endif #ifndef BSP_OVERRIDE_TRANSFER_CALLBACK_ARGS_T /** Callback function parameter data. */ typedef struct st_transfer_callback_args_t { void const * p_context; ///< Placeholder for user data. Set in @ref transfer_api_t::open function in ::transfer_cfg_t. } transfer_callback_args_t; #endif /** Driver specific information. */ typedef struct st_transfer_properties { uint32_t block_count_max; ///< Maximum number of blocks uint32_t block_count_remaining; ///< Number of blocks remaining uint32_t transfer_length_max; ///< Maximum number of transfers uint32_t transfer_length_remaining; ///< Number of transfers remaining } transfer_properties_t; #ifndef BSP_OVERRIDE_TRANSFER_INFO_T /** This structure specifies the properties of the transfer. * @warning When using DTC, this structure corresponds to the descriptor block registers required by the DTC. * The following components may be modified by the driver: p_src, p_dest, num_blocks, and length. * @warning When using DTC, do NOT reuse this structure to configure multiple transfers. Each transfer must * have a unique transfer_info_t. * @warning When using DTC, this structure must not be allocated in a temporary location. Any instance of this * structure must remain in scope until the transfer it is used for is closed. * @note When using DTC, consider placing instances of this structure in a protected section of memory. */ typedef struct st_transfer_info { union { struct { uint32_t : 16; uint32_t : 2; /** Select what happens to destination pointer after each transfer. */ transfer_addr_mode_t dest_addr_mode : 2; /** Select to repeat source or destination area, unused in @ref TRANSFER_MODE_NORMAL. */ transfer_repeat_area_t repeat_area : 1; /** Select if interrupts should occur after each individual transfer or after the completion of all planned * transfers. */ transfer_irq_t irq : 1; /** Select when the chain transfer ends. */ transfer_chain_mode_t chain_mode : 2; uint32_t : 2; /** Select what happens to source pointer after each transfer. */ transfer_addr_mode_t src_addr_mode : 2; /** Select number of bytes to transfer at once. @see transfer_info_t::length. */ transfer_size_t size : 2; /** Select mode from @ref transfer_mode_t. */ transfer_mode_t mode : 2; } transfer_settings_word_b; uint32_t transfer_settings_word; }; void const * volatile p_src; ///< Source pointer void * volatile p_dest; ///< Destination pointer /** Number of blocks to transfer when using @ref TRANSFER_MODE_BLOCK (both DTC an DMAC) or * @ref TRANSFER_MODE_REPEAT (DMAC only) or * @ref TRANSFER_MODE_REPEAT_BLOCK (DMAC only), unused in other modes. */ volatile uint16_t num_blocks; /** Length of each transfer. Range limited for @ref TRANSFER_MODE_BLOCK, @ref TRANSFER_MODE_REPEAT, * and @ref TRANSFER_MODE_REPEAT_BLOCK * see HAL driver for details. */ volatile uint16_t length; } transfer_info_t; #endif /** Driver configuration set in @ref transfer_api_t::open. All elements except p_extend are required and must be * initialized. */ typedef struct st_transfer_cfg { /** Pointer to transfer configuration options. If using chain transfer (DTC only), this can be a pointer to * an array of chained transfers that will be completed in order. */ transfer_info_t * p_info; void const * p_extend; ///< Extension parameter for hardware specific settings. } transfer_cfg_t; /** Select whether to start single or repeated transfer with software start. */ typedef enum e_transfer_start_mode { TRANSFER_START_MODE_SINGLE = 0, ///< Software start triggers single transfer. TRANSFER_START_MODE_REPEAT = 1 ///< Software start transfer continues until transfer is complete. } transfer_start_mode_t; /** Transfer functions implemented at the HAL layer will follow this API. */ typedef struct st_transfer_api { /** Initial configuration. * * @param[in,out] p_ctrl Pointer to control block. Must be declared by user. Elements set here. * @param[in] p_cfg Pointer to configuration structure. All elements of this structure * must be set by user. */ fsp_err_t (* open)(transfer_ctrl_t * const p_ctrl, transfer_cfg_t const * const p_cfg); /** Reconfigure the transfer. * Enable the transfer if p_info is valid. * * @param[in,out] p_ctrl Pointer to control block. Must be declared by user. Elements set here. * @param[in] p_info Pointer to a new transfer info structure. */ fsp_err_t (* reconfigure)(transfer_ctrl_t * const p_ctrl, transfer_info_t * p_info); /** Reset source address pointer, destination address pointer, and/or length, keeping all other settings the same. * Enable the transfer if p_src, p_dest, and length are valid. * * @param[in] p_ctrl Control block set in @ref transfer_api_t::open call for this transfer. * @param[in] p_src Pointer to source. Set to NULL if source pointer should not change. * @param[in] p_dest Pointer to destination. Set to NULL if destination pointer should not change. * @param[in] num_transfers Transfer length in normal mode or number of blocks in block mode. In DMAC only, * resets number of repeats (initially stored in transfer_info_t::num_blocks) in * repeat mode. Not used in repeat mode for DTC. */ fsp_err_t (* reset)(transfer_ctrl_t * const p_ctrl, void const * p_src, void * p_dest, uint16_t const num_transfers); /** Enable transfer. Transfers occur after the activation source event (or when * @ref transfer_api_t::softwareStart is called if no peripheral event is chosen as activation source). * * @param[in] p_ctrl Control block set in @ref transfer_api_t::open call for this transfer. */ fsp_err_t (* enable)(transfer_ctrl_t * const p_ctrl); /** Disable transfer. Transfers do not occur after the activation source event (or when * @ref transfer_api_t::softwareStart is called if no peripheral event is chosen as the DMAC activation source). * @note If a transfer is in progress, it will be completed. Subsequent transfer requests do not cause a * transfer. * * @param[in] p_ctrl Control block set in @ref transfer_api_t::open call for this transfer. */ fsp_err_t (* disable)(transfer_ctrl_t * const p_ctrl); /** Start transfer in software. * @warning Only works if no peripheral event is chosen as the DMAC activation source. * @note Not supported for DTC. * * @param[in] p_ctrl Control block set in @ref transfer_api_t::open call for this transfer. * @param[in] mode Select mode from @ref transfer_start_mode_t. */ fsp_err_t (* softwareStart)(transfer_ctrl_t * const p_ctrl, transfer_start_mode_t mode); /** Stop transfer in software. The transfer will stop after completion of the current transfer. * @note Not supported for DTC. * @note Only applies for transfers started with TRANSFER_START_MODE_REPEAT. * @warning Only works if no peripheral event is chosen as the DMAC activation source. * * @param[in] p_ctrl Control block set in @ref transfer_api_t::open call for this transfer. */ fsp_err_t (* softwareStop)(transfer_ctrl_t * const p_ctrl); /** Provides information about this transfer. * * @param[in] p_ctrl Control block set in @ref transfer_api_t::open call for this transfer. * @param[out] p_properties Driver specific information. */ fsp_err_t (* infoGet)(transfer_ctrl_t * const p_ctrl, transfer_properties_t * const p_properties); /** Releases hardware lock. This allows a transfer to be reconfigured using @ref transfer_api_t::open. * * @param[in] p_ctrl Control block set in @ref transfer_api_t::open call for this transfer. */ fsp_err_t (* close)(transfer_ctrl_t * const p_ctrl); /** To update next transfer information without interruption during transfer. * Allow further transfer continuation. * * @param[in] p_ctrl Control block set in @ref transfer_api_t::open call for this transfer. * @param[in] p_src Pointer to source. Set to NULL if source pointer should not change. * @param[in] p_dest Pointer to destination. Set to NULL if destination pointer should not change. * @param[in] num_transfers Transfer length in normal mode or block mode. */ fsp_err_t (* reload)(transfer_ctrl_t * const p_ctrl, void const * p_src, void * p_dest, uint32_t const num_transfers); /** Specify callback function and optional context pointer and working memory pointer. * * @param[in] p_ctrl Control block set in @ref transfer_api_t::open call for this transfer. * @param[in] p_callback Callback function to register * @param[in] p_context Pointer to send to callback function * @param[in] p_callback_memory Pointer to volatile memory where callback structure can be allocated. * Callback arguments allocated here are only valid during the callback. */ fsp_err_t (* callbackSet)(transfer_ctrl_t * const p_ctrl, void (* p_callback)(transfer_callback_args_t *), void const * const p_context, transfer_callback_args_t * const p_callback_memory); } transfer_api_t; /** This structure encompasses everything that is needed to use an instance of this interface. */ typedef struct st_transfer_instance { transfer_ctrl_t * p_ctrl; ///< Pointer to the control structure for this instance transfer_cfg_t const * p_cfg; ///< Pointer to the configuration structure for this instance transfer_api_t const * p_api; ///< Pointer to the API structure for this instance } transfer_instance_t; /* Common macro for FSP header files. There is also a corresponding FSP_HEADER macro at the top of this file. */ FSP_FOOTER #endif /*******************************************************************************************************************//** * @} (end defgroup TRANSFER_API) **********************************************************************************************************************/ 这里存在 // 标准函数原型应类似: fsp_err_t R_TRANSFER_Open( transfer_ctrl_t * const p_ctrl, transfer_cfg_t const * const p_cfg);

filetype

import numpy as np import matplotlib.pyplot as plt from pymatgen.io.vasp import Vasprun from pymatgen.core.structure import Structure from scipy.signal import savgol_filter from scipy.spatial import cKDTree from tqdm import tqdm import matplotlib as mpl import warnings from collections import defaultdict import os import argparse import csv from datetime import datetime import sys # 忽略可能的警告 warnings.filterwarnings("ignore", category=UserWarning) # 专业绘图设置 plt.style.use('seaborn-v0_8-whitegrid') mpl.rcParams.update({ 'font.family': 'sans-serif', 'font.sans-serif': ['Arial', 'DejaVu Sans'], 'font.size': 12, 'axes.labelsize': 14, 'axes.titlesize': 16, 'xtick.labelsize': 12, 'ytick.labelsize': 12, 'figure.dpi': 300, 'savefig.dpi': 300, 'figure.figsize': (10, 7), 'lines.linewidth': 2.5, 'legend.fontsize': 11, 'legend.framealpha': 0.9, 'mathtext.default': 'regular' }) def get_parent_p(struct, atom_index): """获取给定氧原子所属的磷酸基团(P原子索引)""" site = struct[atom_index] if site.species_string != "O": return None # 查找最近的P原子(P-O键长通常在1.5-1.6Å) p_neighbors = struct.get_neighbors(site, r=1.8) for neighbor in p_neighbors: if neighbor[0].species_string == "P": return neighbor[0].index return None def identify_atom_types(struct): """识别所有关键原子类型(增强版)""" # 磷酸氧分类 p_oxygens = {"P=O": [], "P-O": [], "P-OH": []} phosphate_hydrogens = [] # 仅P-OH基团中的H原子 # 水合氢离子识别 hydronium_oxygens = [] hydronium_hydrogens = [] # H₃O⁺中的H原子 # 普通水分子 water_oxygens = [] water_hydrogens = [] # 普通水中的H原子 # 氟离子 fluoride_atoms = [i for i, site in enumerate(struct) if site.species_string == "F"] # 铝离子 aluminum_atoms = [i for i, site in enumerate(struct) if site.species_string == "Al"] # 创建快速邻居查找表 neighbor_cache = defaultdict(list) for i, site in enumerate(struct): if site.species_string == "O": neighbors = struct.get_neighbors(site, r=1.3) h_neighbors = [n[0] for n in neighbors if n[0].species_string == "H"] neighbor_cache[i] = h_neighbors # 识别水合氢离子 (H₃O⁺) if len(h_neighbors) == 3: hydronium_oxygens.append(i) for h_site in h_neighbors: hydronium_hydrogens.append(h_site.index) # 识别磷酸基团 for site in struct: if site.species_string == "P": neighbors = struct.get_neighbors(site, r=2.0) # 扩大搜索半径 # 筛选氧原子邻居 o_neighbors = [(n[0], n[1]) for n in neighbors if n[0].species_string == "O"] if len(o_neighbors) < 4: # 如果找不到4个氧原子,使用旧方法 for neighbor in o_neighbors: nn_site = neighbor[0] if neighbor[1] < 1.55: p_oxygens["P=O"].append(nn_site.index) else: if any(n[0].species_string == "H" for n in struct.get_neighbors(nn_site, r=1.3)): p_oxygens["P-OH"].append(nn_site.index) else: p_oxygens["P-O"].append(nn_site.index) continue # 按距离排序 o_neighbors.sort(key=lambda x: x[1]) # 最近的氧原子为P=O p_double_o = o_neighbors[0][0] p_oxygens["P=O"].append(p_double_o.index) # 其他三个氧原子 for i in range(1, 4): o_site = o_neighbors[i][0] # 检查氧原子上是否有氢 if neighbor_cache.get(o_site.index, []): p_oxygens["P-OH"].append(o_site.index) else: p_oxygens["P-O"].append(o_site.index) # 识别P-OH基团中的H原子 (磷酸中的H) for o_idx in p_oxygens["P-OH"]: # 获取与P-OH氧相连的H原子 h_neighbors = neighbor_cache.get(o_idx, []) for h_site in h_neighbors: if h_site.species_string == "H": phosphate_hydrogens.append(h_site.index) # 识别普通水分子 (排除磷酸氧和水合氢离子) for i, site in enumerate(struct): if site.species_string == "O" and i not in hydronium_oxygens: is_phosphate_oxygen = False for cat in p_oxygens.values(): if i in cat: is_phosphate_oxygen = True break if not is_phosphate_oxygen: water_oxygens.append(i) # 识别普通水分子中的H原子 (水中的H) for o_idx in water_oxygens: h_neighbors = neighbor_cache.get(o_idx, []) for h_site in h_neighbors: if h_site.species_string == "H": water_hydrogens.append(h_site.index) # 验证氢原子总数 total_h = len([s for s in struct if s.species_string == "H"]) classified_h = ( len(phosphate_hydrogens) + len(water_hydrogens) + len(hydronium_hydrogens) ) if total_h != classified_h: print(f" Warning: Hydrogen mismatch! Total H: {total_h}, Classified H: {classified_h}") return { "phosphate_oxygens": p_oxygens, "phosphate_hydrogens": phosphate_hydrogens, "water_oxygens": water_oxygens, "water_hydrogens": water_hydrogens, "hydronium_oxygens": hydronium_oxygens, "hydronium_hydrogens": hydronium_hydrogens, "fluoride_atoms": fluoride_atoms, "aluminum_atoms": aluminum_atoms } def calculate_rdf(structures, center_selector, target_selector, r_max=8.0, bin_width=0.05, progress=True, exclude_bonds=True, bond_threshold=1.3, exclude_same_group=False): """ 计算径向分布函数(每帧重新识别原子类型) """ bins = np.arange(0, r_max, bin_width) hist = np.zeros(len(bins) - 1) total_centers = 0 total_targets = 0 total_volume = 0 iterator = tqdm(structures, desc="Calculating RDF") if progress else structures for struct in iterator: # 关键修改:对每一帧进行原子类型识别 atom_types = identify_atom_types(struct) # 识别中心原子 centers = center_selector(atom_types) # 识别目标原子 targets = target_selector(atom_types) # 检查是否有足够的原子 if len(centers) == 0 or len(targets) == 0: continue total_centers += len(centers) total_targets += len(targets) total_volume += struct.volume # 获取坐标 center_coords = np.array([struct[i].coords for i in centers]) target_coords = np.array([struct[i].coords for i in targets]) # 使用KDTree高效查询 lattice = struct.lattice kdtree = cKDTree(target_coords, boxsize=lattice.abc) # 计算所有中心原子的距离分布 distances, indices = kdtree.query(center_coords, k=min(50, len(targets)), distance_upper_bound=r_max) # 过滤有效距离并排除自身化学键 valid_distances = [] for i, dist_list in enumerate(distances): center_idx = centers[i] for j, dist in enumerate(dist_list): if dist > r_max: continue target_idx = targets[indices[i][j]] # 排除自身化学键 if exclude_bonds: # 计算中心原子和目标原子的实际距离 actual_dist = struct.get_distance(center_idx, target_idx) if actual_dist < bond_threshold: continue # 排除同一磷酸基团内部的相互作用 if exclude_same_group: center_p = get_parent_p(struct, center_idx) target_p = get_parent_p(struct, target_idx) # 如果属于同一个P原子,则跳过 if center_p is not None and target_p is not None and center_p == target_p: continue valid_distances.append(dist) # 统计距离分布 if len(valid_distances) > 0: hist += np.histogram(valid_distances, bins=bins)[0] # 归一化处理 n_frames = len(structures) if total_volume > 0: avg_density = total_targets / (total_volume * n_frames) else: avg_density = 0 r = bins[:-1] + bin_width/2 # 分箱中心位置 rdf = np.zeros_like(r) for i in range(len(hist)): r_lower = bins[i] r_upper = bins[i+1] shell_vol = 4/3 * np.pi * (r_upper**3 - r_lower**3) expected_count = shell_vol * avg_density * total_centers / n_frames if expected_count > 0: rdf[i] = hist[i] / expected_count else: rdf[i] = 0 # 平滑处理 if len(rdf) > 5: window_length = min(11, len(rdf)//2*2+1) # 确保为奇数 rdf_smoothed = savgol_filter(rdf, window_length=window_length, polyorder=3) else: rdf_smoothed = rdf # 计算主要峰值位置 (1.5-3.0Å范围内) peak_info = {} mask = (r >= 1.5) & (r <= 3.0) if np.any(mask): peak_idx = np.argmax(rdf_smoothed[mask]) peak_pos = r[mask][peak_idx] peak_val = rdf_smoothed[mask][peak_idx] peak_info = {"position": peak_pos, "value": peak_val} else: peak_info = {"position": None, "value": None} return r, rdf_smoothed, peak_info def main(): # 解析命令行参数 parser = argparse.ArgumentParser(description='计算径向分布函数(RDF)') parser.add_argument('system_name', type=str, help='体系名称') parser.add_argument('vasprun_file', type=str, help='vasprun.xml文件路径') parser.add_argument('--r_max', type=float, default=8.0, help='最大距离(默认: 8.0Å)') parser.add_argument('--bin_width', type=float, default=0.05, help='分箱宽度(默认: 0.05Å)') parser.add_argument('--skip', type=int, default=5, help='跳过的离子步数(默认: 5)') parser.add_argument('--output', type=str, default='RDF_Results', help='输出目录(默认: RDF_Results)') args = parser.parse_args() # 创建输出目录 os.makedirs(args.output, exist_ok=True) os.makedirs(os.path.join(args.output, "RDF_Plots"), exist_ok=True) os.makedirs(os.path.join(args.output, "RDF_Data"), exist_ok=True) print(f"\n{'='*50}") print(f"Processing {args.system_name}: {args.vasprun_file}") print(f"{'='*50}") try: # 加载VASP结果 vr = Vasprun(args.vasprun_file, ionic_step_skip=args.skip) structures = vr.structures print(f"Loaded {len(structures)} frames") # 测试原子识别 test_struct = structures[0] atom_types = identify_atom_types(test_struct) print("\nAtom identification test (first frame):") print(f"P=O atoms: {len(atom_types['phosphate_oxygens']['P=O'])}") print(f"P-O atoms: {len(atom_types['phosphate_oxygens']['P-O'])}") print(f"P-OH atoms: {len(atom_types['phosphate_oxygens']['P-OH'])}") print(f"磷酸中的H (P-OH): {len(atom_types['phosphate_hydrogens'])}") print(f"水中的O: {len(atom_types['water_oxygens'])}") print(f"水中的H: {len(atom_types['water_hydrogens'])}") print(f"H₃O⁺中的O: {len(atom_types['hydronium_oxygens'])}") print(f"H₃O⁺中的H: {len(atom_types['hydronium_hydrogens'])}") print(f"氟离子: {len(atom_types['fluoride_atoms'])}") print(f"铝离子: {len(atom_types['aluminum_atoms'])}") # 定义RDF分组 rdf_groups = { "Phosphate_H_Bonds": [ (lambda s: s["phosphate_oxygens"]["P=O"], lambda s: s["water_hydrogens"] + s["hydronium_hydrogens"], "P=O···H", "#1f77b4"), (lambda s: s["phosphate_oxygens"]["P-OH"], lambda s: s["water_hydrogens"] + s["hydronium_hydrogens"], "P-OH···H", "#ff7f0e"), (lambda s: s["phosphate_oxygens"]["P-O"], lambda s: s["water_hydrogens"] + s["hydronium_hydrogens"], "P-O···H", "#17becf"), (lambda s: s["phosphate_hydrogens"], lambda s: s["water_oxygens"] + s["hydronium_oxygens"], "P-OH···O", "#d62728"), ], "Hydronium_H_Bonds": [ (lambda s: s["hydronium_oxygens"], lambda s: s["water_hydrogens"] + s["phosphate_hydrogens"], "H3O+ O···H", "#9467bd"), (lambda s: s["hydronium_hydrogens"], lambda s: s["water_oxygens"], "H3O+ H···Ow", "#8c564b"), (lambda s: s["hydronium_hydrogens"], lambda s: s["phosphate_oxygens"]["P=O"] + s["phosphate_oxygens"]["P-O"] + s["phosphate_oxygens"]["P-OH"], "H3O+ H···Op", "#e377c2"), ], "Water_Network": [ (lambda s: s["water_oxygens"], lambda s: s["water_hydrogens"], "Ow···Hw", "#2ca02c"), (lambda s: s["water_oxygens"], lambda s: s["hydronium_hydrogens"], "Ow···Hh", "#d62728"), ], "Fluoride_H_Bonds": [ (lambda s: s["fluoride_atoms"], lambda s: s["water_hydrogens"], "F···Hw", "#2ca02c"), (lambda s: s["fluoride_atoms"], lambda s: s["phosphate_hydrogens"], "F···Hp", "#d62728"), (lambda s: s["fluoride_atoms"], lambda s: s["hydronium_hydrogens"], "F···Hh", "#9467bd"), ], "Aluminum_Coordination": [ (lambda s: s["aluminum_atoms"], lambda s: s["water_oxygens"], "Al···Ow", "#1f77b4"), (lambda s: s["aluminum_atoms"], lambda s: s["phosphate_oxygens"]["P=O"] + s["phosphate_oxygens"]["P-O"] + s["phosphate_oxygens"]["P-OH"], "Al···Op", "#ff7f0e"), (lambda s: s["aluminum_atoms"], lambda s: s["fluoride_atoms"], "Al···F", "#17becf"), ], "Phosphate_Phosphate_Interactions": [ (lambda s: s["phosphate_oxygens"]["P=O"] + s["phosphate_oxygens"]["P-O"] + s["phosphate_oxygens"]["P-OH"], lambda s: s["phosphate_oxygens"]["P=O"] + s["phosphate_oxygens"]["P-O"] + s["phosphate_oxygens"]["P-OH"], "All P-Oxygens", "#1f77b4", True), (lambda s: s["phosphate_oxygens"]["P=O"], lambda s: s["phosphate_oxygens"]["P=O"], "P=O···P=O", "#ff7f0e", True), (lambda s: s["phosphate_oxygens"]["P=O"], lambda s: s["phosphate_oxygens"]["P-O"], "P=O···P-O", "#2ca02c", True), (lambda s: s["phosphate_oxygens"]["P=O"], lambda s: s["phosphate_oxygens"]["P-OH"], "P=O···P-OH", "#d62728", True), (lambda s: s["phosphate_oxygens"]["P-O"], lambda s: s["phosphate_oxygens"]["P-OH"], "P-O···P-OH", "#9467bd", True), (lambda s: s["phosphate_oxygens"]["P-OH"], lambda s: s["phosphate_oxygens"]["P-OH"], "P-OH···P-OH", "#8c564b", True), (lambda s: s["phosphate_hydrogens"], lambda s: s["phosphate_oxygens"]["P=O"], "P-OH···P=O (H-bond)", "#e377c2", False), (lambda s: s["phosphate_hydrogens"], lambda s: s["phosphate_oxygens"]["P-O"], "P-OH···P-O (H-bond)", "#7f7f7f", False), (lambda s: s["phosphate_hydrogens"], lambda s: s["phosphate_oxygens"]["P-OH"], "P-OH···P-OH (H-bond)", "#bcbd22", False) ] } # 标题映射 title_map = { "Phosphate_H_Bonds": "Phosphate Hydrogen Bonding", "Hydronium_H_Bonds": "Hydronium Ion Hydrogen Bonding", "Water_Network": "Water Network Hydrogen Bonding", "Fluoride_H_Bonds": "Fluoride Ion Hydrogen Bonding", "Aluminum_Coordination": "Aluminum Coordination Environment", "Phosphate_Phosphate_Interactions": "Phosphate-Phosphate Interactions" } # 存储所有数据 system_data = { "rdf_results": {}, "peak_infos": {} } # 存储每个分组的最大y值 group_y_max = {group_name: 0 for group_name in rdf_groups.keys()} global_x_max = args.r_max # 计算所有RDF分组 for group_name, pairs in rdf_groups.items(): system_data["rdf_results"][group_name] = {} system_data["peak_infos"][group_name] = {} # 当前分组在当前体系中的最大y值 group_y_max_current = 0 for pair in pairs: # 根据元组长度决定参数 if len(pair) == 4: # (center_sel, target_sel, label, color) center_sel, target_sel, label, color = pair exclude_same = False elif len(pair) == 5: # (center_sel, target_sel, label, color, exclude_same) center_sel, target_sel, label, color, exclude_same = pair print(f"\nCalculating RDF for: {label}") try: r, rdf, peak_info = calculate_rdf( structures, center_sel, target_sel, r_max=global_x_max, bin_width=args.bin_width, exclude_bonds=True, bond_threshold=1.3, exclude_same_group=exclude_same ) system_data["rdf_results"][group_name][label] = (r, rdf, color) system_data["peak_infos"][group_name][label] = peak_info # 更新当前分组在当前体系中的最大y值 if len(rdf) > 0: current_max = np.max(rdf) if current_max > group_y_max_current: group_y_max_current = current_max # 打印峰值信息 if peak_info["position"] is not None: print(f" Peak for {label}: {peak_info['position']:.3f} A (g(r) = {peak_info['value']:.2f})") else: print(f" No significant peak found for {label} in 1.5-3.0 A range") except Exception as e: print(f"Error calculating RDF for {label}: {str(e)}") system_data["rdf_results"][group_name][label] = (np.array([]), np.array([]), color) system_data["peak_infos"][group_name][label] = {"position": None, "value": None} # 更新该分组的全局最大y值 if group_y_max_current > group_y_max[group_name]: group_y_max[group_name] = group_y_max_current # 为每个分组添加15%的余量 for group_name in group_y_max: group_y_max[group_name] = group_y_max[group_name] * 1.15 print(f"\nGroup-wise y-axis maximum values:") for group_name, y_max in group_y_max.items(): print(f"{group_name}: {y_max:.2f}") # 生成图表 print(f"\nGenerating plots for {args.system_name}") for group_name, group_data in system_data["rdf_results"].items(): print(f"\nGenerating plot for {args.system_name} - {group_name}") fig, ax = plt.subplots(figsize=(10, 7)) # 绘制所有RDF曲线 for label, (r, rdf, color) in group_data.items(): if len(r) > 0 and len(rdf) > 0: ax.plot(r, rdf, color=color, label=label, alpha=0.9, linewidth=2.5) # 应用统一坐标尺度 ax.set_xlim(0, global_x_max) # 为相同类型的图表设置统一的y轴范围 if group_y_max[group_name] > 0: ax.set_ylim(0, group_y_max[group_name]) else: ax.set_ylim(0, 5) # 图表装饰 ax.set_xlabel('Radial Distance (A)', fontweight='bold') ax.set_ylabel('g(r)', fontweight='bold') # 添加体系名称到标题 ax.set_title(f"{args.system_name}: {title_map[group_name]}", fontsize=16, pad=15) # 图例布局 ax.legend(ncol=1, loc='best', framealpha=0.95) # 添加网格 ax.grid(True, linestyle='--', alpha=0.7) # 添加氢键区域标记(1.5-2.5Å) ax.axvspan(1.5, 2.5, alpha=0.1, color='green') plt.tight_layout() filename = os.path.join(args.output, "RDF_Plots", f"RDF_{args.system_name}_{group_name}.png") plt.savefig(filename, bbox_inches='tight', dpi=300) print(f"Saved plot: {filename}") plt.close() # 保存RDF数据 print(f"\nSaving RDF data for {args.system_name}") system_dir = os.path.join(args.output, "RDF_Data", args.system_name) os.makedirs(system_dir, exist_ok=True) # 保存峰值信息 peak_info_path = os.path.join(system_dir, f"Peak_Positions_{args.system_name}.csv") with open(peak_info_path, 'w', newline='', encoding='utf-8') as f: writer = csv.writer(f) writer.writerow(["Group", "Interaction", "Peak Position (A)", "g(r) Value"]) for group_name, peaks in system_data["peak_infos"].items(): for label, info in peaks.items(): if info["position"] is not None: writer.writerow([group_name, label, f"{info['position']:.3f}", f"{info['value']:.3f}"]) else: writer.writerow([group_name, label, "N/A", "N/A"]) print(f"Saved peak positions: {peak_info_path}") # 保存所有RDF曲线数据 for group_name, group_results in system_data["rdf_results"].items(): group_dir = os.path.join(system_dir, group_name) os.makedirs(group_dir, exist_ok=True) for label, (r, rdf, color) in group_results.items(): if len(r) > 0 and len(rdf) > 0: # 创建安全的文件名 safe_label = label.replace(" ", "_").replace("/", "_").replace("=", "_") safe_label = safe_label.replace("(", "").replace(")", "").replace("$", "") safe_label = safe_label.replace("+", "p").replace(" ", "_") filename = f"RDF_{args.system_name}_{group_name}_{safe_label}.csv" filepath = os.path.join(group_dir, filename) # 写入CSV文件 with open(filepath, 'w', newline='', encoding='utf-8') as f: writer = csv.writer(f) writer.writerow(["Distance (A)", "g(r)"]) for i in range(len(r)): writer.writerow([r[i], rdf[i]]) print(f"Saved RDF data: {filename}") else: print(f"No valid RDF data for {label} in {args.system_name} - {group_name}") print(f"\nCompleted processing for {args.system_name}") except Exception as e: print(f"Error processing {args.system_name}: {str(e)}") import traceback traceback.print_exc() sys.exit(1) if __name__ == "__main__": main()以上代码尝试实现对每帧重新识别原子类型,进而实现对包含质子转移过程的RDF计算,请先检验上述代码的合理性,以及可行性,在anaconda promt中执行,需要符合The Journal of Chemical Physics期刊,注意图的标尺即类型,同时输出文本结构方便origin重新绘制更改

以网为生
  • 粉丝: 35
上传资源 快速赚钱