XADC是zynq芯片内部进行温度和电压检测的模块,通过(https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18842132/XADC)这篇wiki可以知道,XADC控制器有两种表现形式,一种是位于PS内部,即文档中提到的the PS-XADC interface for the PS software to control the XADC,另一种是位于PL内部,通过IP核的方式实现。目前常用的是第一种。这里也采用第一种PS自带的xadc来获取CPU片内的温度。

查看内核是否支持XADC,勾上CONFIG_XILINX_XADC

<*> Xilinx XADC driver

查看dts,文件为linux-xlnx/arch/arm/boot/dts/zynq-7000.dtsi,可以看到dts已经支持XADC

  amba: amba {
                u-boot,dm-pre-reloc;
                compatible = "simple-bus";
                #address-cells = <1>;
                #size-cells = <1>;
                interrupt-parent = <&intc>;
                ranges;

                adc: adc@f8007100 {
                        compatible = "xlnx,zynq-xadc-1.00.a";
                        reg = <0xf8007100 0x20>;
                        interrupts = <0 7 4>;
                        interrupt-parent = <&intc>;
                        clocks = <&clkc 12>;
                };

系统起来后在/sys/bus/iio/devices/iio:device0目录下看到以下信息

in_temp0_raw 是温度原始值,要经过转换,网上查了资料,转换代码如下

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <dirent.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <ctype.h>
#include <pthread.h>
#include <assert.h>
#include <termios.h> 
#include <signal.h>
/**IIO获取温度原始值文件**/
#define SYS_PATH_TEMP_IIO_VALUE    "/sys/bus/iio/devices/iio:device0/in_temp0_raw"
static const int multiplier = 1 << 12; //4096
 
int main(int argc, char *argv[])
{
    FILE *stream;
    float val;
    float temp_value;
     unsigned  char buf[20];
       if ((stream = fopen(SYS_PATH_TEMP_IIO_VALUE, "w+"))== NULL)
       {
          fprintf(stderr,"Cannot open output file.\n");
            return 1;
        }
     fseek(stream, SEEK_SET, 0);
        fread(buf, sizeof(char), sizeof(buf), stream);
     val=atof(buf);
     temp_value=((val * 503.975)/multiplier )-273.15;
     printf("The cpu temp is %.2f\r\n",temp_value);
     fclose(stream); 
     return 0;
}

编译之后运行得到正确的片内温度值

root:~/test/temp# ./temp 
The cpu temp is 74.07

因为没有加散热片,可以看到温度还是比较高的,有74℃了。

如果觉得我的文章对你有用,请随意赞赏