diff --git a/src/arm/soc.c b/src/arm/soc.c index c99e5c5..7484955 100644 --- a/src/arm/soc.c +++ b/src/arm/soc.c @@ -17,7 +17,8 @@ static char* soc_trademark_string[] = { [SOC_VENDOR_EXYNOS] = "Exynos ", [SOC_VENDOR_KIRIN] = "Kirin ", [SOC_VENDOR_BROADCOM] = "Broadcom BCM", - [SOC_VENDOR_APPLE] = "Apple " + [SOC_VENDOR_APPLE] = "Apple ", + [SOC_VENDOR_ALLWINNER] = "Allwinner " }; static char* soc_rpi_string[] = { @@ -38,10 +39,10 @@ void fill_soc(struct system_on_chip* soc, char* soc_name, SOC soc_model, int32_t } bool match_soc(struct system_on_chip* soc, char* raw_name, char* expected_name, char* soc_name, SOC soc_model, int32_t process) { - if(strlen(raw_name) > strlen(expected_name)) - return false; + int len1 = strlen(raw_name); + int len2 = strlen(expected_name); + int len = min(len1, len2); - int len = strlen(raw_name); if(strncmp(raw_name, expected_name, len) != 0) { return false; } @@ -454,6 +455,49 @@ bool match_qualcomm(char* soc_name, struct system_on_chip* soc) { SOC_END } +// https://linux-sunxi.org/Allwinner_SoC_Family +bool match_allwinner(char* soc_name, struct system_on_chip* soc) { + char* tmp; + + if((tmp = strstr(soc_name, "sun")) == NULL) + return false; + + SOC_START + // A series 32 bits + SOC_EQ(tmp, "sun4i", "A10", SOC_ALLWINNER_A10, soc, 55) + SOC_EQ(tmp, "sun5i", "A13", SOC_ALLWINNER_A13, soc, 55) + SOC_EQ(tmp, "sun5i", "A10s", SOC_ALLWINNER_A10S, soc, 55) + SOC_EQ(tmp, "sun7i", "A20", SOC_ALLWINNER_A20, soc, 40) + SOC_EQ(tmp, "sun8i", "A23", SOC_ALLWINNER_A23, soc, 40) + SOC_EQ(tmp, "sun6i", "A31", SOC_ALLWINNER_A31, soc, 40) + SOC_EQ(tmp, "sun6i", "A31s", SOC_ALLWINNER_A31S, soc, 40) + SOC_EQ(tmp, "sun8i", "A33", SOC_ALLWINNER_A33, soc, 40) + SOC_EQ(tmp, "sun8i", "A40", SOC_ALLWINNER_A40, soc, 40) + SOC_EQ(tmp, "sun8i", "A50", SOC_ALLWINNER_A50, soc, 28) + SOC_EQ(tmp, "sun9i", "A80", SOC_ALLWINNER_A80, soc, 28) + SOC_EQ(tmp, "sun8i", "A83T", SOC_ALLWINNER_A83T, soc, 28) + + // H series 32 bits + SOC_EQ(tmp, "sun8i", "H2+", SOC_ALLWINNER_HZP, soc, 40) + SOC_EQ(tmp, "sun8i", "H3", SOC_ALLWINNER_H3, soc, 40) + SOC_EQ(tmp, "sun8i", "H8", SOC_ALLWINNER_H8, soc, 28) + + // H series 64 bits + SOC_EQ(tmp, "sun50i", "H5", SOC_ALLWINNER_H5, soc, 40) + SOC_EQ(tmp, "sun50i", "H6", SOC_ALLWINNER_H6, soc, 28) + SOC_EQ(tmp, "sun50i", "H616", SOC_ALLWINNER_H616, soc, 28) + + // R series 32 bits + SOC_EQ(tmp, "sun5i", "R8", SOC_ALLWINNER_R8, soc, 55) + SOC_EQ(tmp, "sun8i", "R16", SOC_ALLWINNER_R16, soc, 40) + SOC_EQ(tmp, "sun8i", "R40", SOC_ALLWINNER_R40, soc, 40) + SOC_EQ(tmp, "sun8i", "R58", SOC_ALLWINNER_R58, soc, 28) + + // R series 64 bits + SOC_EQ(tmp, "sun50i", "R329", SOC_ALLWINNER_R328, soc, 28) + SOC_END +} + bool match_special(char* soc_name, struct system_on_chip* soc) { char* tmp; @@ -490,6 +534,9 @@ struct system_on_chip* parse_soc_from_string(struct system_on_chip* soc) { if(match_hisilicon(raw_name, soc)) return soc; + if(match_allwinner(raw_name, soc)) + return soc; + match_broadcom(raw_name, soc); return soc; } diff --git a/src/arm/soc.h b/src/arm/soc.h index 90df32c..257fc4a 100644 --- a/src/arm/soc.h +++ b/src/arm/soc.h @@ -13,7 +13,8 @@ enum { SOC_VENDOR_EXYNOS, SOC_VENDOR_KIRIN, SOC_VENDOR_BROADCOM, - SOC_VENDOR_APPLE + SOC_VENDOR_APPLE, + SOC_VENDOR_ALLWINNER }; struct system_on_chip { diff --git a/src/arm/socs.h b/src/arm/socs.h index 922290c..668c4f3 100644 --- a/src/arm/socs.h +++ b/src/arm/socs.h @@ -253,7 +253,31 @@ enum { SOC_SNAPD_SM8250_AB, SOC_SNAPD_SM8350, // APPLE - SOC_APPLE_M1 + SOC_APPLE_M1, + // ALLWINNER + SOC_ALLWINNER_A10, + SOC_ALLWINNER_A13, + SOC_ALLWINNER_A10S, + SOC_ALLWINNER_A20, + SOC_ALLWINNER_A23, + SOC_ALLWINNER_A31, + SOC_ALLWINNER_A31S, + SOC_ALLWINNER_A33, + SOC_ALLWINNER_A40, + SOC_ALLWINNER_A50, + SOC_ALLWINNER_A80, + SOC_ALLWINNER_A83T, + SOC_ALLWINNER_HZP, + SOC_ALLWINNER_H3, + SOC_ALLWINNER_H8, + SOC_ALLWINNER_H5, + SOC_ALLWINNER_H6, + SOC_ALLWINNER_H616, + SOC_ALLWINNER_R8, + SOC_ALLWINNER_R16, + SOC_ALLWINNER_R40, + SOC_ALLWINNER_R58, + SOC_ALLWINNER_R328 }; inline static VENDOR get_soc_vendor_from_soc(SOC soc) { @@ -263,6 +287,7 @@ inline static VENDOR get_soc_vendor_from_soc(SOC soc) { else if(soc >= SOC_MTK_MT6893 && soc <= SOC_MTK_MT8783) return SOC_VENDOR_MEDIATEK; else if(soc >= SOC_SNAPD_QSD8650 && soc <= SOC_SNAPD_SM8350) return SOC_VENDOR_SNAPDRAGON; else if(soc >= SOC_APPLE_M1 && soc <= SOC_APPLE_M1) return SOC_VENDOR_APPLE; + else if(soc >= SOC_ALLWINNER_A10 && soc <= SOC_ALLWINNER_R328) return SOC_VENDOR_ALLWINNER; return SOC_VENDOR_UNKNOWN; } diff --git a/src/common/ascii.h b/src/common/ascii.h index 5f4e27a..158d4d9 100644 --- a/src/common/ascii.h +++ b/src/common/ascii.h @@ -218,6 +218,24 @@ $C1 kMMMMMMMMMMMMMMMMMMMMMMd \ $C1 'KMMMMMMMWXXWMMMMMMMk. \ $C1 \"cooc\"* \"*coo'\" " +#define ASCII_ALLWINNER \ +"$C1 \ +$C1 ################# \ +$C1 .######## ##### #### \ +$C1 ###### ####### \ +$C1 #####. ## ..## ####. \ +$C1 .#### #### ##### #### \ +$C1 #### ## ### ###. ##### . \ +$C1#### ## ## #### .###### ####* . \ +$C1### ## ##.### ## #### .###### \ +$C1### #.## ### ##### ##### . \ +$C1### ### ### .### ### . \ +$C1 #### ### #### #. \ +$C1 #### #* \ +$C1 ##### ##. \ +$C1 ###########. \ +$C1 " + // --------------------- LONG LOGOS ------------------------- // #define ASCII_AMD_L \ "$C1 \ @@ -318,6 +336,8 @@ asciiL logo_broadcom = { ASCII_BROADCOM, 44, 19, false, {C_FG_WHITE, C_FG_ asciiL logo_arm = { ASCII_ARM, 42, 5, false, {C_FG_CYAN}, {C_FG_WHITE, C_FG_CYAN} }; asciiL logo_ibm = { ASCII_IBM, 42, 9, false, {C_FG_CYAN, C_FG_WHITE}, {C_FG_CYAN, C_FG_WHITE} }; asciiL logo_apple = { ASCII_APPLE, 32, 17, false, {C_FG_WHITE}, {C_FG_B_BLACK, C_FG_B_WHITE} }; +asciiL logo_allwinner = { ASCII_ALLWINNER, 47, 16, false, {C_FG_CYAN}, {C_FG_B_BLACK, C_FG_B_CYAN } }; + // Long variants | ----------------------------------------------------------------------------------------------------| asciiL logo_amd_l = { ASCII_AMD_L, 62, 19, true, {C_BG_WHITE, C_BG_GREEN}, {C_FG_WHITE, C_FG_GREEN} }; asciiL logo_intel_l = { ASCII_INTEL_L, 62, 19, true, {C_BG_CYAN, C_BG_WHITE}, {C_FG_CYAN, C_FG_WHITE} }; diff --git a/src/common/printer.c b/src/common/printer.c index 4a3aa1d..004cbdc 100644 --- a/src/common/printer.c +++ b/src/common/printer.c @@ -353,6 +353,8 @@ void choose_ascii_art(struct ascii* art, struct color** cs, struct terminal* ter art->art = &logo_broadcom; else if(art->vendor == SOC_VENDOR_APPLE) art->art = &logo_apple; + else if(art->vendor == SOC_VENDOR_ALLWINNER) + art->art = &logo_allwinner; else { art->art = choose_ascii_art_aux(&logo_arm_l, &logo_arm, term, lf); }