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℃了。
版权属于:咖啡走糖
本文链接:https://www.qwc-lmhhj.cn/archives/166.html
若无注明,本文皆咖啡走糖原创,转载时必须注明出处及本声明!