海思CPU温度采集单元软件开发分为驱动程序部分和用户态软件开发,其中驱动程序部分主要是与硬件交互,实现底层数据采集转换工作,而用户态则主要是程序应用逻辑控制设计。用户态程序设计流程如下:
1.设置温度采集模式
2.设置温度采集周期
3.设置温度报警上限阈值
4.设置温度报警下线阈值
5.使能启动温度采集
6.读取CPU温度值
7.读取温度报警上限标志
8.读取温度报警下限标志
根据文档,编写驱动。示例
static long HiTsensor_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) { Hi_Tsensor_info hitsensor_info; unsigned int tmp = 0; u32 reg_data; //printk("cmd = %04x\n",cmd); switch(cmd) { case SET_MODE: { copy_from_user(&hitsensor_info, (Hi_Tsensor_info*)arg, sizeof(Hi_Tsensor_info)); reg_data = readl((volatile void __iomem *)PERI_PMC68); if(hitsensor_info.value == 1) { reg_data |= 1 << 29; } else { reg_data &= ~(1 << 29); } writel(reg_data, (volatile void __iomem *)PERI_PMC68); } break;
case SET_PERIOD: { copy_from_user(&hitsensor_info, (Hi_Tsensor_info*)arg, sizeof(Hi_Tsensor_info)); tmp = (hitsensor_info.value >> 1) | 0x1; tmp = tmp & 0xFF; reg_data = readl((volatile void __iomem *)PERI_PMC68); reg_data &= 0xFF00FFFF; reg_data |= tmp << 16; writel(reg_data, (volatile void __iomem *)PERI_PMC68); } break; case SET_OVERUP: { copy_from_user(&hitsensor_info, (Hi_Tsensor_info*)arg, sizeof(Hi_Tsensor_info)); reg_data = (hitsensor_info.value&0x3FF) << 16; writel(reg_data, (volatile void __iomem *)PERI_PMC69); } break; case SET_OVERDN: { copy_from_user(&hitsensor_info, (Hi_Tsensor_info*)arg, sizeof(Hi_Tsensor_info)); reg_data = readl((volatile void __iomem *)PERI_PMC69); reg_data |= hitsensor_info.value&0x3FF; writel(reg_data, (volatile void __iomem *)PERI_PMC69); } break; case SET_START: { copy_from_user(&hitsensor_info, (Hi_Tsensor_info*)arg, sizeof(Hi_Tsensor_info)); reg_data = readl((volatile void __iomem *)PERI_PMC68); if(hitsensor_info.value == 1) { reg_data |= 1 << 30; } else { reg_data &= ~(1 << 30); } writel(reg_data, (volatile void __iomem *)PERI_PMC68); } break; case GET_TEMPER: { copy_from_user(&hitsensor_info, (Hi_Tsensor_info*)arg, sizeof(Hi_Tsensor_info)); tmp = readl((volatile void __iomem *)PERI_PMC70); hitsensor_info.value = tmp & 0x3FF; copy_to_user((void __user *)arg, &hitsensor_info, sizeof(Hi_Tsensor_info)); } break; case GET_OVERUP: { copy_from_user(&hitsensor_info, (Hi_Tsensor_info*)arg, sizeof(Hi_Tsensor_info)); tmp = readl((volatile void __iomem *)PERI_PMC74); hitsensor_info.value = tmp & 0x1; copy_to_user((void __user *)arg, &hitsensor_info, sizeof(Hi_Tsensor_info)); } break; case GET_OVERDN: { copy_from_user(&hitsensor_info, (Hi_Tsensor_info*)arg, sizeof(Hi_Tsensor_info)); tmp = readl((volatile void __iomem *)PERI_PMC74); hitsensor_info.value = (tmp >> 1) & 0x1; copy_to_user((void __user *)arg, &hitsensor_info, sizeof(Hi_Tsensor_info)); } break; default: { printk(KERN_ERR "HiTsensor error Unkown parameter\n"); return -1; } break; }
return 0; }
static struct file_operations hitsensor_fops = { owner:THIS_MODULE, open:HiTsensor_open, unlocked_ioctl:HiTsensor_ioctl, release:HiTsensor_release, };
static struct miscdevice hitsensor_dev = { MISC_DYNAMIC_MINOR, "hi_tsensor", &hitsensor_fops, };
static int __init hi_tsensor_init(void) { signed int ret = 0;
ret = misc_register(&hitsensor_dev); if (ret) { printk(KERN_ERR "register misc dev for /dev/hi_tsensor fail!\n"); return ret; } //printk("HiTsensor overup = %d overdown = %d \n",overup,overdown); return 0; }
static void __exit hi_tsensor_exit(void) { writel(0x0, (volatile void __iomem *)PERI_PMC68); misc_deregister(&hitsensor_dev); }
module_init(hi_tsensor_init); module_exit(hi_tsensor_exit);
MODULE_AUTHOR("Gavin"); MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("Hi_Tsensor interface for HI3521d");
全部代码,到我的资源下载
https://download.csdn.net/download/proing/12573385