xref: /btstack/port/raspi/raspi_get_model.c (revision 63ff2b1e64a6f7fe8fbdd0ac1abfc703a433f88e)
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 Helbig int 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