1*63ff2b1eSDirk Helbig 2*63ff2b1eSDirk Helbig #include <stdint.h> 3*63ff2b1eSDirk Helbig #include <stdio.h> 4*63ff2b1eSDirk Helbig #include <stdlib.h> 5*63ff2b1eSDirk Helbig 6*63ff2b1eSDirk Helbig #include "raspi_get_model.h" 7*63ff2b1eSDirk Helbig 8*63ff2b1eSDirk Helbig /** 9*63ff2b1eSDirk Helbig * Raspberry Pi model detection based on, 10*63ff2b1eSDirk Helbig * https://elinux.org/RPi_HardwareHistory 11*63ff2b1eSDirk Helbig **/ raspi_get_model()12*63ff2b1eSDirk Helbigint raspi_get_model() 13*63ff2b1eSDirk Helbig { 14*63ff2b1eSDirk Helbig FILE *f = fopen( "/proc/cpuinfo", "rb" ); 15*63ff2b1eSDirk Helbig if( f == NULL ) 16*63ff2b1eSDirk Helbig { 17*63ff2b1eSDirk Helbig perror( "can't open cpuinfo!" ); 18*63ff2b1eSDirk Helbig return MODEL_UNKNOWN; 19*63ff2b1eSDirk Helbig } 20*63ff2b1eSDirk Helbig 21*63ff2b1eSDirk Helbig int ret = 0; 22*63ff2b1eSDirk Helbig uint32_t revision = 0; 23*63ff2b1eSDirk Helbig uint32_t model = MODEL_UNKNOWN; 24*63ff2b1eSDirk Helbig char line[100] = { 0 }; 25*63ff2b1eSDirk Helbig char *ptr = NULL; 26*63ff2b1eSDirk Helbig for(; ret < 1;) 27*63ff2b1eSDirk Helbig { 28*63ff2b1eSDirk Helbig ptr = fgets( line, 100, f ); 29*63ff2b1eSDirk Helbig if( ptr == NULL ) 30*63ff2b1eSDirk Helbig break; 31*63ff2b1eSDirk Helbig ret = sscanf( line, "Revision : %x\n", &revision ); 32*63ff2b1eSDirk Helbig } 33*63ff2b1eSDirk Helbig 34*63ff2b1eSDirk Helbig fclose( f ); 35*63ff2b1eSDirk Helbig 36*63ff2b1eSDirk Helbig switch( revision ) 37*63ff2b1eSDirk Helbig { 38*63ff2b1eSDirk Helbig case 0x9000c1: 39*63ff2b1eSDirk Helbig model = MODEL_ZERO_W; 40*63ff2b1eSDirk Helbig break; 41*63ff2b1eSDirk Helbig case 0xa02082: 42*63ff2b1eSDirk Helbig case 0xa22082: 43*63ff2b1eSDirk Helbig case 0xa32082: 44*63ff2b1eSDirk Helbig model = MODEL_3B; 45*63ff2b1eSDirk Helbig break; 46*63ff2b1eSDirk Helbig case 0xa020d3: 47*63ff2b1eSDirk Helbig model = MODEL_3BPLUS; 48*63ff2b1eSDirk Helbig break; 49*63ff2b1eSDirk Helbig case 0x9020e0: 50*63ff2b1eSDirk Helbig model = MODEL_3APLUS; 51*63ff2b1eSDirk Helbig break; 52*63ff2b1eSDirk Helbig default: 53*63ff2b1eSDirk Helbig break; 54*63ff2b1eSDirk Helbig } 55*63ff2b1eSDirk Helbig 56*63ff2b1eSDirk Helbig return model; 57*63ff2b1eSDirk Helbig } 58*63ff2b1eSDirk Helbig 59*63ff2b1eSDirk Helbig 60