zoukankan      html  css  js  c++  java
  • 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;
    }
    

      

      

     

  • 相关阅读:
    windows下的SASS/Compass的安装与卸载
    玩转HTML5移动页面(优化篇)
    小谈数组去重
    前端问题解答
    JavaScript使用封装
    JavaScript使用接口
    JavaScript精要(系列)
    JavaScript DOM节点和文档类型
    JavaScript数组类型
    JavaScript函数表达式
  • 原文地址:https://www.cnblogs.com/yuanqiangfei/p/14922400.html
Copyright © 2011-2022 走看看