📄 mycpu.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 + -