diff --git a/support/sg2002/kvm_system/main/lib/oled_ctrl/oled_ctrl.cpp b/support/sg2002/kvm_system/main/lib/oled_ctrl/oled_ctrl.cpp index 994edc4..bc2ecf6 100644 --- a/support/sg2002/kvm_system/main/lib/oled_ctrl/oled_ctrl.cpp +++ b/support/sg2002/kvm_system/main/lib/oled_ctrl/oled_ctrl.cpp @@ -1,682 +1,703 @@ -#include "oled_ctrl.h" - -using namespace maix; -using namespace maix::sys; -using namespace maix::peripheral; -i2c::I2C oled_alpha(1, i2c::Mode::MASTER); -i2c::I2C oled_beta(5, i2c::Mode::MASTER); - -uint8_t OLED_state = 0; -uint8_t kvm_hw_ver = 0; - -/* mode = OLED_CMD - * = OLED_DATA */ -void oled_write_register(uint8_t mode, uint8_t data) -{ - if(OLED_state){ - uint8_t buf[2]; - - buf[0] = mode; - buf[1] = data; - if(kvm_hw_ver == 0){ - if(oled_alpha.writeto(OLED_ADDR, buf, 2) == (int)-err::Err::ERR_IO){ - return; - } - } else if(kvm_hw_ver == 1){ - if(oled_beta.writeto(OLED_ADDR, buf, 2) == (int)-err::Err::ERR_IO){ - return; - } - } else if(kvm_hw_ver == 2){ - if(oled_beta.writeto(OLED_PCIe_ADDR, buf, 2) == (int)-err::Err::ERR_IO){ - return; - } - } - return; - } - return; -} - -int oled_exist(void) -{ - // gpio::GPIO oled_rst("GPIOP19", gpio::Mode::OUT, gpio::Pull::PULL_UP); - // oled_rst.high(); - // system("devmem 0x030010D4 32 0x3"); - // system("devmem 0x030010D0 32 0x2"); - // system("devmem 0x030010DC 32 0x2"); - - if(access("/etc/kvm/hw", F_OK) == 0){ - uint8_t RW_Data[2]; - FILE *fp = fopen("/etc/kvm/hw", "r"); - fread(RW_Data, sizeof(char), 2, fp); - fclose(fp); - if(RW_Data[0] == 'b') kvm_hw_ver = 1; - else if(RW_Data[0] == 'p') kvm_hw_ver = 2; - } - - uint8_t buf[2]; - - buf[0] = OLED_CMD; - buf[1] = 0xAE; - if(kvm_hw_ver == 0){ - if(oled_alpha.writeto(OLED_ADDR, buf, 2) == (int)-err::Err::ERR_IO){ - return 0; - } - } else if(kvm_hw_ver == 1){ - printf("beta\r\n"); - if(oled_beta.writeto(OLED_ADDR, buf, 2) == (int)-err::Err::ERR_IO){ - return 0; - } - } else if(kvm_hw_ver == 2){ - printf("PCIe\r\n"); - if(oled_beta.writeto(OLED_PCIe_ADDR, buf, 2) == (int)-err::Err::ERR_IO){ - return 0; - } - } - return 1; -} - -// 坐标设置 -void OLED_Set_Pos(uint8_t x, uint8_t y) -{ - // oled_write_register(OLED_CMD, 0xb0+y); - // oled_write_register(OLED_CMD, ((x&0xf0)>>4)|0x10); - // oled_write_register(OLED_CMD, (x&0x0f)); - if(kvm_hw_ver == 2){ - x += 32; - y += 8; - } - oled_write_register(OLED_CMD, 0xb0+y); - oled_write_register(OLED_CMD, ((x&0xf0)>>4)|0x10); - oled_write_register(OLED_CMD, (x&0x0f)); -} - -//开启OLED显示 -void OLED_Display_On() -{ - oled_write_register(OLED_CMD, 0X8D); - oled_write_register(OLED_CMD, 0X14); - oled_write_register(OLED_CMD, 0XAF); -} - -//关闭OLED显示 -void OLED_Display_Off() -{ - oled_write_register(OLED_CMD, 0X8D); - oled_write_register(OLED_CMD, 0X10); - oled_write_register(OLED_CMD, 0XAE); -} - -//清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!! -void OLED_Clear(void) -{ - uint8_t i,n; - for(i=0;i<8;i++) - { - oled_write_register(OLED_CMD, 0xb0+i); - oled_write_register(OLED_CMD, 0x00); - oled_write_register(OLED_CMD, 0x10); - for(n=0;n<128;n++)oled_write_register(OLED_DATA, 0x00); - } //更新显示 -} - -void OLED_Fill(void) -{ - uint8_t i,n; - for(i=0;i<8;i++) - { - oled_write_register(OLED_CMD, 0xb0+i); - oled_write_register(OLED_CMD, 0x00); - oled_write_register(OLED_CMD, 0x10); - for(n=0;n<128;n++)oled_write_register(OLED_DATA, 0xFF); - } //更新显示 -} - -//在指定位置显示一个字符,包括部分字符 -//x:0~127 -//y:0~63 -//sizey:选择字体 6x8 8x16 -void OLED_ShowChar(uint8_t x,uint8_t y,char chr,uint8_t sizey) -{ - uint8_t c=0,sizex=sizey/2; - uint16_t i=0,size1; - if(sizey==8)size1=6; - else if(sizey==4)size1=4; - else size1=(sizey/8+((sizey%8)?1:0))*(sizey/2); - c=chr-' ';//得到偏移后的值 - OLED_Set_Pos(x, y); - for(i=0; i>4)|0x10); + // oled_write_register(OLED_CMD, (x&0x0f)); + if(kvm_hw_ver == 2){ + x += 32; + y += 8; + } + oled_write_register(OLED_CMD, 0xb0+y); + oled_write_register(OLED_CMD, ((x&0xf0)>>4)|0x10); + oled_write_register(OLED_CMD, (x&0x0f)); +} + +//开启OLED显示 +void OLED_Display_On() +{ + oled_write_register(OLED_CMD, 0X8D); + oled_write_register(OLED_CMD, 0X14); + oled_write_register(OLED_CMD, 0XAF); +} + +//关闭OLED显示 +void OLED_Display_Off() +{ + oled_write_register(OLED_CMD, 0X8D); + oled_write_register(OLED_CMD, 0X10); + oled_write_register(OLED_CMD, 0XAE); +} + +//清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!! +void OLED_Clear(void) +{ + uint8_t i,n; + for(i=0;i<8;i++) + { + oled_write_register(OLED_CMD, 0xb0+i); + oled_write_register(OLED_CMD, 0x00); + oled_write_register(OLED_CMD, 0x10); + for(n=0;n<128;n++)oled_write_register(OLED_DATA, 0x00); + } //更新显示 +} + +void OLED_Fill(void) +{ + uint8_t i,n; + for(i=0;i<8;i++) + { + oled_write_register(OLED_CMD, 0xb0+i); + oled_write_register(OLED_CMD, 0x00); + oled_write_register(OLED_CMD, 0x10); + for(n=0;n<128;n++)oled_write_register(OLED_DATA, 0xFF); + } //更新显示 +} + +//在指定位置显示一个字符,包括部分字符 +//x:0~127 +//y:0~63 +//sizey:选择字体 6x8 8x16 +void OLED_ShowChar(uint8_t x,uint8_t y,char chr,uint8_t sizey) +{ + uint8_t c=0,sizex=sizey/2; + uint16_t i=0,size1; + if(sizey==8)size1=6; + else if(sizey==4)size1=4; + else size1=(sizey/8+((sizey%8)?1:0))*(sizey/2); + c=chr-' ';//得到偏移后的值 + OLED_Set_Pos(x, y); + for(i=0; i