⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mycpu.c

📁 LINUX操作系统下
💻 C
字号:
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/poll.h>
#include <linux/types.h>
#include <linux/fs.h>
#include <asm/uaccess.h> 
#include <asm/io.h>



MODULE_LICENSE("GPL"); 

#define MAJOR_NUM 88			 
#define CCCR_REG 0X41300000
#define CCSR_REG 0x4130000C 
#define READ_REG 1
#define WRITE_REG 2

struct reg_info
{
	unsigned long cccr_info;
	unsigned long ccsr_info;
	unsigned long clkcfg_info;
};


static int mycpu_open(struct inode *inode, struct file *filp)
{
	return 0;
}
static int mycpu_release(struct inode *inode, struct file *filp)
{
	return 0;
}

static int mycpu_ioctl(struct inode *inodep, struct file *filp,unsigned int cmd, unsigned long arg)
{
	struct reg_info my_reg_info;
	unsigned long *addr_cccr,*addr_ccsr;
	unsigned long clkcfg;
	
	switch(cmd){
		case READ_REG:
			addr_ccsr = ioremap(CCSR_REG,0X04);
			asm( "mrc\tp14, 0, %0, c6, c0, 0" : "=r" (clkcfg) );
			
                   my_reg_info.ccsr_info = *addr_ccsr;					// READ CCSR REG
			my_reg_info.clkcfg_info = clkcfg;					// READ CLKCFG REG

			copy_to_user((void *)arg, &my_reg_info, sizeof(my_reg_info));
  			break;
			
		case WRITE_REG: 
			copy_from_user(&my_reg_info, (void *)arg, sizeof(my_reg_info)); //SET CCCR REG
			addr_cccr = ioremap(CCCR_REG,0X04);
			*addr_cccr = my_reg_info.cccr_info;

			asm("mov R0,%0;mcr P14,0,R0,C6,C0,0"::"r"(my_reg_info.clkcfg_info));             //SET CLKCFG REG
			
  			break;
		default:
			break;
	}

	return 0;
}


static struct file_operations mycpu_fops ={ 
	open:mycpu_open,
	release:mycpu_release,
	ioctl:mycpu_ioctl,
}; 


static int __init mycpu_init(void) 
{ 
	int ret; 
	
	ret = register_chrdev(MAJOR_NUM, "mycpu", &mycpu_fops); 
	if (ret) 
	{ 
		printk("mycpu register failure"); 
	} 
	else 
	{ 
		printk("mycpu register success"); 
	} 

	return ret; 
} 

static void __exit mycpu_exit(void) 
{ 
	int ret; 

	ret = 0;
	unregister_chrdev(MAJOR_NUM, "mycpu"); 
	if (ret) 
	{ 
		printk("mycpu unregister failure"); 
	} 
	else 
	{ 
		printk("mycpu unregister success"); 
	} 
} 


module_init(mycpu_init); 
module_exit(mycpu_exit);


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -