cgminer分析

Driver-cpu.c

ipollo_detect 函数里创建线程调用nminer_main,nminer_main中进行了硬件信息初始化,hash board的初始化

,然后进入while循环中接收来自cgminer发过来的消息,在nminer_proc_msg中处理消息(目前没有做任何处理动作,只是回一些序列号,哈希板的数目,芯片数目等信息)。

cgminer和nminer通过环形消息缓冲器(MCP  buffer)去进行通信。

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;

  

 

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

 

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

 

 

mcp_sniff去抓取MCP消息类型:MCP_PKG_NO、MCP_CMD_DETECT(命令)、MCP_RESP_DETECT(响应)

 

 

/* 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 @ 2021-06-23 13:46  轻轻的吻  阅读(355)  评论(0编辑  收藏  举报