驱动增加获取和设置唤醒源接口
This commit is contained in:
parent
84730e85fc
commit
b10824bc07
|
@ -20,9 +20,13 @@
|
||||||
#include <linux/memblock.h>
|
#include <linux/memblock.h>
|
||||||
#include <linux/memblock.h>
|
#include <linux/memblock.h>
|
||||||
#include <linux/pagemap.h>
|
#include <linux/pagemap.h>
|
||||||
|
#include <linux/io.h>
|
||||||
|
|
||||||
#define WEIGHT_ADDR 0x4307F000 // 权重加载的内存地址处
|
#define WEIGHT_ADDR 0x4307F000 // 权重加载的内存地址处
|
||||||
#define MEM_ACCESS_RELEASE_PHYS_ADDR _IOR('M', 0, unsigned int) // 自定义ioctl命令,用于释放预留内存
|
#define M_PAGE_SIZE (4 * 1024) // 内存对齐,应该是4K
|
||||||
|
#define MEM_ACCESS_RELEASE_PHYS_ADDR _IOR('M', 0, unsigned int)
|
||||||
|
#define MEM_ACCESS_GET_WKSRC_SRC _IOW('M', 1, unsigned int)
|
||||||
|
#define MEM_ACCESS_SET_WKSRC_SRC _IOR('M', 2, unsigned int)
|
||||||
|
|
||||||
static int major = 0;
|
static int major = 0;
|
||||||
static struct class *mem_operation_class;
|
static struct class *mem_operation_class;
|
||||||
|
@ -73,9 +77,14 @@ static int mem_operation_drv_mmap(struct file *file, struct vm_area_struct *vma)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
unsigned char readData[sizeof(int)];
|
||||||
|
} wakeup_src_t;
|
||||||
|
|
||||||
|
|
||||||
static long mem_operation_drv_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
static long mem_operation_drv_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
wakeup_src_t wakeupsrc = {.readData[0] = 0};
|
||||||
|
|
||||||
switch (cmd) {
|
switch (cmd) {
|
||||||
case MEM_ACCESS_RELEASE_PHYS_ADDR: {
|
case MEM_ACCESS_RELEASE_PHYS_ADDR: {
|
||||||
|
@ -92,12 +101,59 @@ static long mem_operation_drv_ioctl(struct file *file, unsigned int cmd, unsigne
|
||||||
printk("release phy addr: 0x%x, size: %d\n", WEIGHT_ADDR, mem_size);
|
printk("release phy addr: 0x%x, size: %d\n", WEIGHT_ADDR, mem_size);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case MEM_ACCESS_GET_WKSRC_SRC:
|
||||||
|
{
|
||||||
|
void __iomem *vaddr = NULL;
|
||||||
|
|
||||||
|
// vaddr = ioremap(WEIGHT_ADDR, sizeof(wakeupsrc));
|
||||||
|
// vaddr = ioremap_nocache(PHYS_ADDR, SIZE);
|
||||||
|
vaddr = memremap(WEIGHT_ADDR, M_PAGE_SIZE, MEMREMAP_WB);
|
||||||
|
if (!vaddr)
|
||||||
|
{
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
wakeupsrc.readData[0] = readb(vaddr);
|
||||||
|
// memcpy_fromio(buffer, vaddr, SIZE);
|
||||||
|
// copy_to_user(arg, vaddr, SIZE) ?
|
||||||
|
// printk(KERN_EMERG "give wake up source:%d\n", wakeupsrc.readData[0]);
|
||||||
|
|
||||||
|
if (copy_to_user(arg, &wakeupsrc, sizeof(wakeupsrc)))
|
||||||
|
{
|
||||||
|
// iounmap(vaddr);
|
||||||
|
memunmap(vaddr);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
// iounmap(vaddr);
|
||||||
|
memunmap(vaddr);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MEM_ACCESS_SET_WKSRC_SRC:
|
||||||
|
{
|
||||||
|
void __iomem *vaddr = NULL;
|
||||||
|
|
||||||
|
if (copy_from_user(&wakeupsrc, (void __user *)arg, sizeof(wakeupsrc)))
|
||||||
|
{
|
||||||
|
return -EFAULT;
|
||||||
|
}
|
||||||
|
vaddr = memremap(WEIGHT_ADDR, M_PAGE_SIZE, MEMREMAP_WB);
|
||||||
|
if (!vaddr)
|
||||||
|
{
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
writeb(wakeupsrc.readData[0], vaddr);
|
||||||
|
|
||||||
|
memunmap(vaddr);
|
||||||
|
|
||||||
|
// printk(KERN_EMERG "set wake up source:%d\n", wakeupsrc.readData[0]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
ret = -EINVAL;
|
return -EINVAL;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct file_operations mem_operation_drv = {
|
static struct file_operations mem_operation_drv = {
|
||||||
|
|
Loading…
Reference in New Issue