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;
}

 

  

  

 

 

posted @   轻轻的吻  阅读(413)  评论(0编辑  收藏  举报
编辑推荐:
· 基于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)
点击右上角即可分享
微信分享提示