Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision | |||
en:lcd_cpuinfo.c [2015/09/03 12:57] charles.park |
en:lcd_cpuinfo.c [2015/09/03 12:58] (current) charles.park old revision restored (2015/08/11 17:32) |
||
---|---|---|---|
Line 1: | Line 1: | ||
+ | <file c lcd_cpuInfo.c> | ||
+ | //------------------------------------------------------------------------------------------------------------ | ||
+ | // | ||
+ | // ODROID-XU4 printing CPU informations Test Application. | ||
+ | // | ||
+ | // Defined port number is wiringPi port number. | ||
+ | // | ||
+ | // Compile : gcc -o <create excute file name> <source file name> -lwiringPi -lwiringPiDev -lpthread | ||
+ | // Run : sudo ./<created excute file name> | ||
+ | // | ||
+ | //------------------------------------------------------------------------------------------------------------ | ||
+ | #include <stdio.h> | ||
+ | #include <stdlib.h> | ||
+ | #include <stdint.h> | ||
+ | #include <fcntl.h> | ||
+ | |||
+ | #include <unistd.h> | ||
+ | #include <string.h> | ||
+ | #include <time.h> | ||
+ | #include <ifaddrs.h> | ||
+ | #include <sys/socket.h> | ||
+ | #include <sys/ioctl.h> | ||
+ | #include <netinet/in.h> | ||
+ | #include <net/if.h> | ||
+ | #include <arpa/inet.h> | ||
+ | |||
+ | #include <wiringPi.h> | ||
+ | #include <wiringPiI2C.h> | ||
+ | #include <wiringSerial.h> | ||
+ | #include <lcd.h> | ||
+ | |||
+ | //------------------------------------------------------------------------------------------------------------ | ||
+ | // | ||
+ | // Global handle Define | ||
+ | // | ||
+ | //------------------------------------------------------------------------------------------------------------ | ||
+ | |||
+ | //------------------------------------------------------------------------------------------------------------ | ||
+ | // | ||
+ | // LCD: | ||
+ | // | ||
+ | //------------------------------------------------------------------------------------------------------------ | ||
+ | #define LCD_ROW 2 // 16 Char | ||
+ | #define LCD_COL 16 // 2 Line | ||
+ | #define LCD_BUS 4 // Interface 4 Bit mode | ||
+ | #define LCD_UPDATE_PERIOD 300 // 300ms | ||
+ | |||
+ | static unsigned char lcdFb[LCD_ROW][LCD_COL] = {0, }; | ||
+ | |||
+ | static int lcdHandle = 0; | ||
+ | |||
+ | // | ||
+ | // DispMode | ||
+ | // 0 = date & time, 1 = ethrenet ip addr, 2 = cpu temperature | ||
+ | // 3 = freq governor. 4 = Big core frequency, 5 = Little core frequency | ||
+ | // | ||
+ | static int DispMode = 0; | ||
+ | |||
+ | #define PORT_LCD_RS 7 // GPX1.2(#18) | ||
+ | #define PORT_LCD_E 0 // GPA0.3(#174) | ||
+ | #define PORT_LCD_D4 2 // GPX1.5(#21) | ||
+ | #define PORT_LCD_D5 3 // GPX1.6(#22) | ||
+ | #define PORT_LCD_D6 1 // GPA0.2(#173) | ||
+ | #define PORT_LCD_D7 4 // GPX1.3(#19) | ||
+ | |||
+ | //------------------------------------------------------------------------------------------------------------ | ||
+ | // | ||
+ | // Button: | ||
+ | // | ||
+ | //------------------------------------------------------------------------------------------------------------ | ||
+ | #define PORT_BUTTON1 5 // GPX1.7(#23) | ||
+ | #define PORT_BUTTON2 6 // GPX2.0(#24) | ||
+ | |||
+ | //------------------------------------------------------------------------------------------------------------ | ||
+ | // | ||
+ | // LED: | ||
+ | // | ||
+ | //------------------------------------------------------------------------------------------------------------ | ||
+ | static int ledPos = 0; | ||
+ | |||
+ | const int ledPorts[] = { | ||
+ | 21, // GPX2.4(#28) | ||
+ | 22, // GPX2.6(#30) | ||
+ | 23, // GPX2.7(#31) | ||
+ | 11, // GPX2.1(#25) | ||
+ | 26, // GPX2.5(#29) | ||
+ | 27, // GPX3.1(#33) | ||
+ | }; | ||
+ | |||
+ | #define MAX_LED_CNT sizeof(ledPorts) / sizeof(ledPorts[0]) | ||
+ | |||
+ | //------------------------------------------------------------------------------------------------------------ | ||
+ | // | ||
+ | // DispMode | ||
+ | // 0 = date & time, 1 = ethrenet ip addr, 2 = cpu temperature | ||
+ | // 3 = freq governor. 4 = Big core frequency, 5 = Little core frequency | ||
+ | // | ||
+ | //------------------------------------------------------------------------------------------------------------ | ||
+ | // | ||
+ | // Get little core freq(CPU4) | ||
+ | // | ||
+ | //------------------------------------------------------------------------------------------------------------ | ||
+ | #define FD_LITTLECORE_FREQ "/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq" | ||
+ | |||
+ | static void get_littlecore_freq(void) | ||
+ | { | ||
+ | int n, fd, freq; | ||
+ | char buf[LCD_COL]; | ||
+ | | ||
+ | memset(buf, ' ', sizeof(buf)); | ||
+ | |||
+ | if((fd = open(FD_LITTLECORE_FREQ, O_RDONLY)) < 0) { | ||
+ | fprintf(stderr, "%s : file open error!\n", __func__); | ||
+ | } | ||
+ | else { | ||
+ | read(fd, buf, sizeof(buf)); | ||
+ | close(fd); | ||
+ | freq = atoi(buf); | ||
+ | n = sprintf(buf, "Little-Core Freq"); | ||
+ | strncpy(&lcdFb[0][0], buf, n); | ||
+ | n = sprintf(buf, "%d Mhz", freq / 1000); | ||
+ | strncpy(&lcdFb[1][4], buf, n); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | //------------------------------------------------------------------------------------------------------------ | ||
+ | // | ||
+ | // Get big core freq(CPU4) | ||
+ | // | ||
+ | //------------------------------------------------------------------------------------------------------------ | ||
+ | #define FD_BIGCORE_FREQ "/sys/devices/system/cpu/cpu4/cpufreq/scaling_cur_freq" | ||
+ | |||
+ | static void get_bigcore_freq(void) | ||
+ | { | ||
+ | int n, fd, freq; | ||
+ | char buf[LCD_COL]; | ||
+ | | ||
+ | memset(buf, ' ', sizeof(buf)); | ||
+ | |||
+ | if((fd = open(FD_BIGCORE_FREQ, O_RDONLY)) < 0) { | ||
+ | fprintf(stderr, "%s : file open error!\n", __func__); | ||
+ | } | ||
+ | else { | ||
+ | n = read(fd, buf, sizeof(buf)); | ||
+ | close(fd); | ||
+ | freq = atoi(buf); | ||
+ | n = sprintf(buf, "Big-Core Freq"); | ||
+ | strncpy(&lcdFb[0][0], buf, n); | ||
+ | n = sprintf(buf, "%d Mhz", freq / 1000); | ||
+ | strncpy(&lcdFb[1][4], buf, n); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | //------------------------------------------------------------------------------------------------------------ | ||
+ | // | ||
+ | // Get system governor(CPU0) | ||
+ | // | ||
+ | //------------------------------------------------------------------------------------------------------------ | ||
+ | #define FD_SYSTEM_GOVERNOR "/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor" | ||
+ | |||
+ | static void get_system_governor(void) | ||
+ | { | ||
+ | int n, fd; | ||
+ | char buf[LCD_COL]; | ||
+ | | ||
+ | memset(buf, ' ', sizeof(buf)); | ||
+ | | ||
+ | if((fd = open(FD_SYSTEM_GOVERNOR, O_RDONLY)) < 0) { | ||
+ | fprintf(stderr, "%s : file open error!\n", __func__); | ||
+ | } | ||
+ | else { | ||
+ | n = read(fd, buf, sizeof(buf)); | ||
+ | close(fd); | ||
+ | strncpy(&lcdFb[1][2], buf, n -1); | ||
+ | n = sprintf(buf, "SYSTEM Governor"); | ||
+ | strncpy(&lcdFb[0][0], buf, n); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | //------------------------------------------------------------------------------------------------------------ | ||
+ | // | ||
+ | // Get ethernet ip addr | ||
+ | // | ||
+ | //------------------------------------------------------------------------------------------------------------ | ||
+ | static void get_ethernet_ip(void) | ||
+ | { | ||
+ | struct ifaddrs *ifa; | ||
+ | int n; | ||
+ | char buf[LCD_COL]; | ||
+ | | ||
+ | memset(buf, ' ', sizeof(buf)); | ||
+ | |||
+ | getifaddrs(&ifa); | ||
+ | | ||
+ | while(ifa) { | ||
+ | if(ifa->ifa_addr && ifa->ifa_addr->sa_family == AF_INET) { | ||
+ | struct sockaddr_in *pAddr = (struct sockaddr_in *)ifa->ifa_addr; | ||
+ | | ||
+ | if(0==strncmp(ifa->ifa_name, "eth", 2)) { | ||
+ | n = sprintf(buf, "My IP Addr(%s)", ifa->ifa_name); | ||
+ | strncpy(&lcdFb[0][0], buf, n); | ||
+ | |||
+ | n = sprintf(buf, "%s", inet_ntoa(pAddr->sin_addr)); | ||
+ | strncpy(&lcdFb[1][1], buf, n); | ||
+ | } | ||
+ | } | ||
+ | ifa = ifa->ifa_next; | ||
+ | } | ||
+ | freeifaddrs(ifa); | ||
+ | } | ||
+ | |||
+ | //------------------------------------------------------------------------------------------------------------ | ||
+ | // | ||
+ | // Get date & time | ||
+ | // | ||
+ | //------------------------------------------------------------------------------------------------------------ | ||
+ | static void get_date_time(void) | ||
+ | { | ||
+ | time_t tm_time; | ||
+ | struct tm *st_time; | ||
+ | char buf[LCD_COL]; | ||
+ | int n; | ||
+ | | ||
+ | memset(buf, ' ', sizeof(buf)); | ||
+ | |||
+ | time(&tm_time); st_time = localtime( &tm_time); | ||
+ | |||
+ | n = strftime(buf, LCD_COL, "%Y/%m/%d %a", st_time); | ||
+ | strncpy(&lcdFb[0][0], buf, n); | ||
+ | n = strftime(buf, LCD_COL, "%H:%M:%S %p", st_time); | ||
+ | strncpy(&lcdFb[1][2], buf, n); | ||
+ | } | ||
+ | |||
+ | //------------------------------------------------------------------------------------------------------------ | ||
+ | // | ||
+ | // Get CPU Temperature | ||
+ | // | ||
+ | //------------------------------------------------------------------------------------------------------------ | ||
+ | #define FD_SYSTEM_TEMP "/sys/class/thermal/thermal_zone0/temp" | ||
+ | |||
+ | static void get_cpu_temperature(void) | ||
+ | { | ||
+ | int fd, temp_C, temp_F, n; | ||
+ | char buf[LCD_COL]; | ||
+ | |||
+ | memset(buf, ' ', sizeof(buf)); | ||
+ | |||
+ | if((fd = open(FD_SYSTEM_TEMP, O_RDONLY)) < 0) { | ||
+ | fprintf(stderr, "%s : file open error!\n", __func__); | ||
+ | } | ||
+ | else { | ||
+ | read(fd, buf, LCD_COL); | ||
+ | close(fd); | ||
+ | |||
+ | temp_C = atoi(buf) / 1000; | ||
+ | temp_F = (temp_C * 18 + 320) / 10; | ||
+ | |||
+ | n = sprintf(buf, "CPU Temperature"); | ||
+ | strncpy(&lcdFb[0][0], buf, n); | ||
+ | n = sprintf(buf, "%3d *C, %3d.%1d *F", temp_C, temp_F, temp_F % 10); | ||
+ | strncpy(&lcdFb[1][0], buf, n); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | //------------------------------------------------------------------------------------------------------------ | ||
+ | // | ||
+ | // LCD Update Function: | ||
+ | // | ||
+ | //------------------------------------------------------------------------------------------------------------ | ||
+ | static void lcd_update (void) | ||
+ | { | ||
+ | int i, j; | ||
+ | |||
+ | // lcd fb clear | ||
+ | memset((void *)&lcdFb, ' ', sizeof(lcdFb)); | ||
+ | | ||
+ | // lcd fb update | ||
+ | switch(DispMode) { | ||
+ | default : DispMode = 0; | ||
+ | case 0: get_date_time(); break; | ||
+ | case 1: get_ethernet_ip(); break; | ||
+ | case 2: get_cpu_temperature(); break; | ||
+ | case 3: get_system_governor(); break; | ||
+ | case 4: get_bigcore_freq(); break; | ||
+ | case 5: get_littlecore_freq(); break; | ||
+ | } | ||
+ | |||
+ | for(i = 0; i < LCD_ROW; i++) { | ||
+ | |||
+ | lcdPosition (lcdHandle, 0, i); | ||
+ | |||
+ | for(j = 0; j < LCD_COL; j++) lcdPutchar(lcdHandle, lcdFb[i][j]); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | //------------------------------------------------------------------------------------------------------------ | ||
+ | // | ||
+ | // system init | ||
+ | // | ||
+ | //------------------------------------------------------------------------------------------------------------ | ||
+ | int system_init(void) | ||
+ | { | ||
+ | int i; | ||
+ | |||
+ | // LCD Init | ||
+ | lcdHandle = lcdInit (LCD_ROW, LCD_COL, LCD_BUS, | ||
+ | PORT_LCD_RS, PORT_LCD_E, | ||
+ | PORT_LCD_D4, PORT_LCD_D5, PORT_LCD_D6, PORT_LCD_D7, 0, 0, 0, 0); | ||
+ | |||
+ | if(lcdHandle < 0) { | ||
+ | fprintf(stderr, "%s : lcdInit failed!\n", __func__); return -1; | ||
+ | } | ||
+ | |||
+ | // GPIO Init(LED Port ALL Output) | ||
+ | for(i = 0; i < MAX_LED_CNT; i++) { | ||
+ | pinMode (ledPorts[i], OUTPUT); pullUpDnControl (PORT_BUTTON1, PUD_OFF); | ||
+ | } | ||
+ | |||
+ | // Button Pull Up Enable. | ||
+ | pinMode (PORT_BUTTON1, INPUT); pullUpDnControl (PORT_BUTTON1, PUD_UP); | ||
+ | pinMode (PORT_BUTTON2, INPUT); pullUpDnControl (PORT_BUTTON2, PUD_UP); | ||
+ | |||
+ | return 0; | ||
+ | } | ||
+ | |||
+ | //------------------------------------------------------------------------------------------------------------ | ||
+ | // | ||
+ | // board data update | ||
+ | // | ||
+ | //------------------------------------------------------------------------------------------------------------ | ||
+ | void boardDataUpdate(void) | ||
+ | { | ||
+ | int i; | ||
+ | |||
+ | // LED Control | ||
+ | for(i = 0; i < MAX_LED_CNT; i++) digitalWrite (ledPorts[i], 0); // LED All Clear | ||
+ | |||
+ | // button status read | ||
+ | if(!digitalRead (PORT_BUTTON1)) { | ||
+ | if(DispMode) DispMode--; | ||
+ | else DispMode = 5; | ||
+ | } | ||
+ | if(!digitalRead (PORT_BUTTON2)) { | ||
+ | if(DispMode < 5) DispMode++; | ||
+ | else DispMode = 0; | ||
+ | } | ||
+ | |||
+ | digitalWrite(ledPorts[DispMode], 1); | ||
+ | } | ||
+ | |||
+ | //------------------------------------------------------------------------------------------------------------ | ||
+ | // | ||
+ | // Start Program | ||
+ | // | ||
+ | //------------------------------------------------------------------------------------------------------------ | ||
+ | int main (int argc, char *argv[]) | ||
+ | { | ||
+ | int timer = 0 ; | ||
+ | |||
+ | wiringPiSetup (); | ||
+ | |||
+ | if (system_init() < 0) | ||
+ | { | ||
+ | fprintf (stderr, "%s: System Init failed\n", __func__); return -1; | ||
+ | } | ||
+ | |||
+ | for(;;) { | ||
+ | | ||
+ | if (millis () < timer) { | ||
+ | usleep(100000); // 100ms sleep state | ||
+ | continue ; | ||
+ | } | ||
+ | |||
+ | timer = millis () + LCD_UPDATE_PERIOD; | ||
+ | |||
+ | // All Data update | ||
+ | boardDataUpdate(); | ||
+ | |||
+ | // lcd update | ||
+ | lcd_update(); | ||
+ | } | ||
+ | |||
+ | return 0 ; | ||
+ | } | ||
+ | |||
+ | //------------------------------------------------------------------------------------------------------------ | ||
+ | //------------------------------------------------------------------------------------------------------------ | ||
+ | </file> |