cgminer分析
Driver-cpu.c
ipollo_detect 函数里创建线程调用nminer_main,nminer_main中进行了硬件信息初始化,hash board的初始化
,然后进入while循环中接收来自cgminer发过来的消息,在nminer_proc_msg中处理消息(目前没有做任何处理动作,只是回一些序列号,哈希板的数目,芯片数目等信息)。
cgminer和nminer通过环形消息缓冲器(MCP buffer)去进行通信。
1 2 3 4 5 6 7 8 9 10 | uint32_t id; char fw_ver[16]; uint8_t mac[8]; /* 6 Bytes */ char sn[32 - 6]; char model[32]; char hwtype[32]; char swtype[32]; uint32_t hboard_cnt; /* Max 8 hboards */ uint32_t hboard_chip_cnt[8]; } __attribute__((__packed__)) MCP_RESP_DETECT_T; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | void *nminer_main( void *arg) { nmlog_set_level(NMLOG_INFO); nmlog_info( "NMiner: task started" ); ( void )arg; /* Initialize Hardware */ if (hwinfo_read() != 0) { nmlog_fatal( "Failed to read hardware infomation!" ); while (1) { }; return NULL; } hwinfo_show(); /* Detect and check hash-boards and chips */ init_miner(); if (mcp_init() != 0) { nmlog_fatal( "NMiner: MCP init failed, quit!" ); while (1) { }; return NULL; } /* endless loop */ while (1) { /* Proess Message from cgminer */ nminer_proc_msg(); /* Update Info */ } return NULL; } #else int main( int argc, char *argv[]) { nmlog_trace( "Hello %s!" , "world" ); nmlog_debug( "Hello %s!" , "world" ); nmlog_info( "Hello %s!" , "world" ); nmlog_warn( "Hello %s!" , "world" ); nmlog_fatal( "Hello %s!" , "world" ); return 0; } #endif |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | static void nminer_proc_msg( void ) { switch (mcp_sniff(MCP_CG2NM)) { case MCP_PKG_NO: break ; case MCP_CMD_DETECT: { MCP_CMD_DETECT_T detect; MCP_RESP_DETECT_T resp; if (mcp_recv(MCP_NM2CG, (uint8_t *)&detect, sizeof (detect)) != 0) { nmlog_error( "NMiner: MCP receive detect cmd failed" ); break ; } nmlog_info( "NMiner: CmdDetect id: 0x%x" , detect.id); resp.id = time (NULL); // fw_ver memset (resp.fw_ver, 0, MEMBER_SIZE(MCP_RESP_DETECT_T, fw_ver)); strncpy (resp.fw_ver, fwinfo_ver(), MEMBER_SIZE(MCP_RESP_DETECT_T, fw_ver) - 1); // mac *(uint64_t *)(resp.mac) = *(uint64_t *)hwinfo_mac(); // sn memset (resp.sn, 0, MEMBER_SIZE(MCP_RESP_DETECT_T, sn)); strncpy (resp.sn, hwinfo_sn(), MEMBER_SIZE(MCP_RESP_DETECT_T, sn) - 1); // model memset (resp.model, 0, MEMBER_SIZE(MCP_RESP_DETECT_T, model)); strncpy (resp.model, hwinfo_model(), MEMBER_SIZE(MCP_RESP_DETECT_T, model) - 1); // hwtype memset (resp.hwtype, 0, MEMBER_SIZE(MCP_RESP_DETECT_T, hwtype)); strncpy (resp.hwtype, hwinfo_hwtype(), MEMBER_SIZE(MCP_RESP_DETECT_T, hwtype) - 1); // swtype memset (resp.swtype, 0, MEMBER_SIZE(MCP_RESP_DETECT_T, swtype)); strncpy (resp.swtype, hwinfo_swtype(), MEMBER_SIZE(MCP_RESP_DETECT_T, swtype) - 1); // hboard_cnt resp.hboard_cnt = HBOARD_CNT_MAX; // hboard_chip_cnt memset (resp.hboard_chip_cnt, 0, sizeof (uint32_t) * ARRAY_SIZE(resp.hboard_chip_cnt)); for ( int i = 0; i < ( int )resp.hboard_cnt; i++) resp.hboard_chip_cnt[i] = HBOARD_CHIP_CNT; if (mcp_resp_detect(&resp) != 0) { nmlog_error( "NMiner: MCP respone detect failed" ); break ; } break ; } default : nmlog_error( "NMiner: Undefined package received." ); break ; } return ; } |
1 | mcp_sniff去抓取MCP消息类型:MCP_PKG_NO、MCP_CMD_DETECT(命令)、MCP_RESP_DETECT(响应) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | /* Sniff MCP message type */ MCP_PKG_TYPE_T mcp_sniff(MCP_CHAN_T chan) { MCP_HEADER_T header; uint32_t crc; int recv_ret = mcp_recv_raw(chan, (uint8_t *)&header, sizeof (header)); if (recv_ret == 0) { return 0; } else if (recv_ret < 0) { mcplog_error( "NMiner: MCP receive header failed, clear buffer now." ); goto RECV_ERR; } crc = crc32(0, (uint8_t *)&(header.ver), sizeof (MCP_HEADER_T) - MEMBER_SIZE(MCP_HEADER_T, crc)); if (crc != header.crc) { /* Receieve wrong header, clear MQ */ mcplog_error( "MCP: Wrong header! read: %08x, calc: %08x" , header.crc, crc); goto RECV_ERR; } if (header.ver != MCPROTO_VER) { mcplog_fatal( "MCP: header version mismatch!" ); goto RECV_ERR; } return header.type; RECV_ERR: mcp_chan_clear(chan); return -1; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)