Пример #1
0
phantom_device_t * driver_etc_smbios_probe( const char *name, int stage )
{
    (void) stage;
    struct smbios_eps * ep = smbios_identify();

    if( seq_number || ep == 0 ) return 0;

    if(smbios_cksum(ep))
    {
        SHOW_ERROR0( 0, "SMBios checksum failed");
        //error = ENXIO;
        return 0;
    }

    SHOW_INFO( 0, "SMBios Version: %u.%u",
               ep->SMBIOS_Major, ep->SMBIOS_Minor);

    if(bcd2bin(ep->SMBIOS_BCD_Revision))
        SHOW_INFO( 4, "SMBios BCD Revision: %u.%u",
                   bcd2bin(ep->SMBIOS_BCD_Revision >> 4),
                   bcd2bin(ep->SMBIOS_BCD_Revision & 0x0f));


    phantom_device_t * dev = malloc(sizeof(phantom_device_t));
    dev->name = name;
    dev->seq_number = seq_number++;
    dev->drv_private = ep;

    dev->dops.read = smbios_read;
    /*
    dev->dops.stop = beep_stop;

    dev->dops.write = beep_write;
    */

    return dev;
}
Пример #2
0
static int 
smbios_find_eps(void)
{
	uintptr_t addr;
	u_int8_t major, minor;

	if (smbios_eps == 0xffff)
		return 0;

	/* already set */
	if (smbios_eps > 0)
		return 1;

	addr = bios_sigsearch(SMBIOS_START, SMBIOS_SIG, SMBIOS_LEN,
			      SMBIOS_STEP, SMBIOS_OFF);
	if (addr != 0) {

		smbios_eps = BIOS_PADDRTOVADDR(addr);

		if (smbios_cksum(smbios_eps)) {
			printf("SMBIOS checksum failed.\n");
			smbios_eps = 0xffff;
			return 0;
		} else {
			printf("SMBIOS found\n"); 
			major = *((u_int8_t *)(smbios_eps + 0x6));
			minor = *((u_int8_t *)(smbios_eps + 0x7));
			printf("SMBIOS %i.%i found\n", major, minor); 
			return 1;
		}
	}

	printf("SMBIOS Signature not found\n");
	smbios_eps = 0xffff;
	return 0;
}