Ejemplo n.º 1
0
signed BootParameters2 (struct plc * plc)

{
	unsigned module = 0;
	struct nvm_header2 nvm_header;
	if (lseek (plc->PIB.file, 0, SEEK_SET))
	{
		error (1, errno, FILE_CANTHOME, plc->PIB.name);
	}
	do
	{
		if (read (plc->PIB.file, &nvm_header, sizeof (nvm_header)) != sizeof (nvm_header))
		{
			error (1, errno, NVM_HDR_CANTREAD, plc->PIB.name, module);
		}
		if (LE16TOH (nvm_header.MajorVersion) != 1)
		{
			error (1, ECANCELED, NVM_HDR_VERSION, plc->PIB.name, module);
		}
		if (LE16TOH (nvm_header.MinorVersion) != 1)
		{
			error (1, ECANCELED, NVM_HDR_VERSION, plc->PIB.name, module);
		}
		if (checksum32 (&nvm_header, sizeof (nvm_header), 0))
		{
			error (1, ECANCELED, NVM_HDR_CHECKSUM, plc->PIB.name, module);
		}

#if 0

		if (_allclr (LE16TOH (nvm_header.ExecuteMask), (1 << (plc->hardwareID - 1))))
		{
			if (lseek (plc->PIB.file, LE32TOH (nvm_header.NextHeader), SEEK_SET) == -1)
			{
				error (1, errno, "Can't skip module: %s (%d)", plc->PIB.name, module);
			}
		}
		else

#endif

		if (LE32TOH (nvm_header.ImageType) == NVM_IMAGE_PIB)
		{
			if (WriteExecuteParameters2 (plc, module, &nvm_header))
			{
				return (-1);
			}
			break;
		}
		if (lseek (plc->PIB.file, LE32TOH (nvm_header.NextHeader), SEEK_SET) == -1)
		{
			error (1, errno, "Can't skip module: %s (%d)", plc->PIB.name, module);
		}
		module++;
	}
	while (~nvm_header.NextHeader);
	return (0);
}
signed WriteExecuteParameters (struct plc * plc, unsigned module, void const * nvm_header) 

{
	return ((LE32TOH (*(uint32_t *)(nvm_header)) == 0x60000000)? WriteExecuteParameters1 (plc, module, nvm_header): WriteExecuteParameters2 (plc, module, nvm_header));
}