admin 发表于 2022-1-20 13:48:53

SC60 SDM450 Android9.0 HP5806驱动

需求:
      实现在SC60 Android9.0的平台上,驱动HP5806,是现在APP端获取到温度和气压高度值!

解决方案:
   JNI部分代码如下(hp5806_driver.tar.gz为在Android9.0下的驱动移植包;):
typedef struct
{
    int16_t      C0;
    int16_t      C1;
    int32_t      C00;
    int32_t      C10;
    int16_t      C01;
    int16_t      C11;
    int16_t      C20;
    int16_t      C21;
    int16_t      C30;
    uint32_t tmp_osr_scale_coeff;
    uint32_t prs_osr_scale_coeff;
}hp5806_calib_data;

typedef struct{
    uint8_tpressure;
    uint8_ttemperature;
    hp5806_calib_data calib_coeffs;
}hp5806_report_s;

static int hp5806_fd = -1;

#define KT      524288
#define KP      253952
void hp5806_convert(hp5806_report_s * rp,float * pressure,float *temp)
{
    long         press_raw;
    long         temp_raw;

    long int temputer_valu = 0;
    long int pressure_valu = 0;

    long    Traw;
    long    Praw;
    doubleTraw_sc;
    doublePraw_sc;

    double         temp_scaled;
    float         temp_final;
    double         press_scaled;
    float         press_final;

    LOGE("pressure=0x%x,pressure=0x%x,pressure=0x%x,temperature=0x%x,temperature=0x%x,temperature=0x%x\r\n",rp->pressure,rp->pressure,rp->pressure,rp->temperature,rp->temperature,rp->temperature);
    LOGE("calib.C0 =%d,C1 =%d,C00 =%d,C10 =%d,C01 =%d,C11 =%d,C20 =%d,C21 =%d,C30 =%d\r\n",rp->calib_coeffs.C0,rp->calib_coeffs.C1,rp->calib_coeffs.C00,rp->calib_coeffs.C10,rp->calib_coeffs.C01,rp->calib_coeffs.C11,rp->calib_coeffs.C20,rp->calib_coeffs.C21,rp->calib_coeffs.C30);

    press_raw = (rp->pressure) + (rp->pressure<<8) + (rp->pressure <<16);
    temp_raw= (rp->temperature) + (rp->temperature<<8) + (rp->temperature <<16);

    LOGE("press_raw %ld temp_raw %ld\r\n",press_raw,temp_raw);
    if(press_raw>8388607)
    {
      press_raw=press_raw-16777216;
    }

    Traw_sc=(double)temp_raw/KT;
    Praw_sc=(double)press_raw/KP;

    LOGE("Praw_sc %lf Traw_sc %lf\r\n",Praw_sc,Traw_sc);

    temp_final=(float)rp->calib_coeffs.C0*0.5f + (float)rp->calib_coeffs.C1*Traw_sc;
    LOGE("temp_final %f\r\n",temp_final);


    press_final=rp->calib_coeffs.C00 + Praw_sc *(rp->calib_coeffs.C10 + Praw_sc *(rp->calib_coeffs.C20+ Praw_sc *rp->calib_coeffs.C30)) + Traw_sc*rp->calib_coeffs.C01 + Traw_sc *Praw_sc *(rp->calib_coeffs.C11+Praw_sc *rp->calib_coeffs.C21);
    LOGE("press_final %f\r\n",press_final);

    temputer_valu = (long int)(temp_final*1000);
    pressure_valu = (long int)(press_final*1000);
    LOGE("temputer_valu %ld pressure_valu %ld \r\n",temputer_valu,pressure_valu);
}




bool hp5806_open()
{
    hp5806_fd = open("/dev/HP5806", O_RDONLY);
    usleep(10000);
    if(hp5806_fd < 0){
      LOGE("Can not open dev %s!\n", "/dev/hp5806");
      return false;
    }
    LOGE("open dev %s! success!\n", "/dev/hp5806");
    return true;
}

bool hp5806_close()
{
    int ret = 0;
    ret = close(hp5806_fd);

    return ret;
}

long nmh21_get_temp(void)
{
    int ret;
    long    temputer_valu = 0,temp_raw;
    doubleTraw_sc;
    float         temp_final;

    hp5806_report_s report_hp5806;

    hp5806_open();
    ret = read(hp5806_fd,&report_hp5806,sizeof(report_hp5806));
    if(ret < 0)
      LOGE("read hp5806_fd fail!\n");
    else{
         //LOGE("report_hp5806.pressure 0x%x 0x%x 0x%x!\n",report_hp5806.pressure,report_hp5806.pressure,report_hp5806.pressure);
         LOGE("report_hp5806.temperature 0x%x 0x%x 0x%x!\n",report_hp5806.temperature,report_hp5806.temperature,report_hp5806.temperature);

      temp_raw= (report_hp5806.temperature) + (report_hp5806.temperature<<8) + (report_hp5806.temperature <<16);
      if(temp_raw>8388607)
      {
            temp_raw=temp_raw-16777216;
      }
      Traw_sc=(double)temp_raw/KT;

      temp_final=(float)report_hp5806.calib_coeffs.C0*0.5f + report_hp5806.calib_coeffs.C1*Traw_sc;

      temputer_valu = (long)(temp_final * 1000);

      LOGE("temp_raw=%ld , Traw_sc=%lf, temp_final=%f temputer_valu=%ld\r\n",temp_raw,Traw_sc,temp_final,temputer_valu);
    }

    hp5806_close();

    return temputer_valu;

}

long nmh21_get_pressure(void)
{
    int ret;
    long    pressure_valu = 0,press_raw,temp_raw;
    doublePraw_sc,Traw_sc;
    float      press_final;

    hp5806_report_s report_hp5806;

    hp5806_open();
    ret = read(hp5806_fd,&report_hp5806,sizeof(report_hp5806));
    if(ret < 0)
      LOGE("read hp5806_fd fail!\n");
    else{
      press_raw = (report_hp5806.pressure) + (report_hp5806.pressure<<8) + (report_hp5806.pressure <<16);
      LOGE("report_hp5806.pressure 0x%x 0x%x 0x%x!\n",report_hp5806.pressure,report_hp5806.pressure,report_hp5806.pressure);

      temp_raw= (report_hp5806.temperature) + (report_hp5806.temperature<<8) + (report_hp5806.temperature <<16);
      LOGE("report_hp5806.temperature 0x%x 0x%x 0x%x!\n",report_hp5806.temperature,report_hp5806.temperature,report_hp5806.temperature);

      if(temp_raw>8388607)
      {
            temp_raw=temp_raw-16777216;
      }
      Traw_sc=(double)temp_raw/KT;

      if(press_raw>8388607)
      {
            press_raw=press_raw-16777216;
      }
      Praw_sc=(double)press_raw/KP;

      press_final=report_hp5806.calib_coeffs.C00 + Praw_sc *(report_hp5806.calib_coeffs.C10 + Praw_sc *(report_hp5806.calib_coeffs.C20+ Praw_sc *report_hp5806.calib_coeffs.C30)) + Traw_sc*report_hp5806.calib_coeffs.C01 + Traw_sc *Praw_sc *(report_hp5806.calib_coeffs.C11+Praw_sc *report_hp5806.calib_coeffs.C21);

      pressure_valu = (long)(press_final * 1000);

      LOGE("temp_raw=%ld , Traw_sc=%lf, press_final=%f pressure_valu=%ld\r\n",temp_raw,Traw_sc,press_final,pressure_valu);
    }

    hp5806_close();

    return pressure_valu;


}
float hp5806_altitude_convert(float Press, float Ref_P)
{
    return 44330 * (1 - powf(((float)Press / (float)Ref_P),(1/5.255)));
}









admin 发表于 2022-1-20 14:13:17

HP206P demo和规格书

页: [1]
查看完整版本: SC60 SDM450 Android9.0 HP5806驱动