思路:底层驱动端创建线程不通过上层控制获取cpu温度模拟pwm控制风扇频率
主要函数:
kthread_run();线程创建函数
filp_open();底层用于打开文件
get_fs();取得当前的地址访问限制值
set_fs();设置当前的地址访问限制值,其宏值有两个KERNEL_DS设置为内核空间,USER_DS设置为用户空间
vfs_read();底层用于读取底层文件
filp_close();关闭文件
#define OPEN_FILE_NAME "/sys/devices/virtual/thermal/thermal_zone4/temp"
static int thread_func(void *data)
{
unsigned char buf[12];
unsigned char temp[2];
int wendu;
int ret,i=0;
int count=0;
struct file *fd;
mm_segment_t fs;
loff_t pos;
printk("fan_pwm:proc start \n");
while(1)
{
。。。
//风扇频率只列出了其中一个
gpio_set_value(fan_devp->pin_no,0);
msleep(4);
gpio_set_value(fan_devp->pin_no,1);
msleep(1);
。。。
//读取文件步骤
fd = filp_open(OPEN_FILE_NAME, O_RDONLY, 0);
fs = get_fs();
set_fs(KERNEL_DS);
pos = 0;temp[0] = 0;temp[1] = 0;
ret = vfs_read(fd, temp, 2*sizeof(char), &pos);
filp_close(fd,NULL);
set_fs(fs);
。。。
}//while(1)
return 0;
}
static int myfan_probe(struct platform_device *dev)
{
。。。
kthread_run(thread_func, NULL,"fan_pwm");
return 0;
}
cpu获取方法不唯一,上述文件代码系统存放温度的文件是以字符形式存放的,例如当前唯独为35,存放方式为0x33 0x35占用两个字节