yb_arm/driver/mem_dump/mem_dump.c

289 lines
7.6 KiB
C
Raw Normal View History

2023-07-12 14:14:31 +08:00
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/irq.h>
#include <linux/poll.h>
#include <linux/cdev.h>
#include <linux/device.h>
#include <asm/io.h>
#include <linux/mm.h>//remap_pfn_range
/* <20><><EFBFBD><EFBFBD><E8B1B8> */
#define BSP_DEV_MAJOR 0
/* <20><><EFBFBD><EFBFBD><E8B1B8> */
#define BSP_DEV_NAME "mem_dump"
/* ģ<><C4A3><EFBFBD><EFBFBD><EFBFBD>غ<EFBFBD><D8BA><EFBFBD> */
static int osp_mem_init(void);
/* ģ<><C4A3>ж<EFBFBD>غ<EFBFBD><D8BA><EFBFBD> */
static void osp_mem_exit(void);
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD> */
int mem_bsp_open(struct inode *inode, struct file *filp);
/* <20>ͷ<EFBFBD><CDB7><EFBFBD><E8B1B8><EFBFBD><EFBFBD> */
int mem_bsp_release(struct inode *inode, struct file *filp);
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
static ssize_t mem_bsp_read (struct file *filp, __user char *buf, size_t count, loff_t *f_pos);
/* ioctl<74><6C><EFBFBD><EFBFBD> */
long mem_bsp_ioctl(struct file *filp, unsigned int cmd, unsigned long arg);
/* mmap<61><70><EFBFBD><EFBFBD> */
int mem_bsp_mmap(struct file *filp, struct vm_area_struct *vma);
/* д<><D0B4><EFBFBD><EFBFBD> */
ssize_t mem_bsp_write(struct file *filp, const char *buf, size_t count, loff_t *f_pos);
/******************************* <20>ֲ<EFBFBD><D6B2><EFBFBD><EAB6A8> ***********************************/
/* bsp <20><><EFBFBD><EFBFBD><E8B1B8> */
typedef struct mem_struct{
int g_s32BspDevMajor ;
unsigned int g_u32CacheCoherent;
struct cdev g_struBspDev;
struct class *cls;
dev_t g_devno;
struct device *parent;
struct device *this_device;
}mem_st;
/******************************* <20><><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5> *************************************/
/*******************************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: mem_init
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>: ģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ں<EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:int
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
* 0 <EFBFBD>ɹ<EFBFBD>
* <0 ʧ<EFBFBD><EFBFBD>
* ˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD>ܲο<EFBFBD>Linux<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣͷ<EFBFBD>ļ<EFBFBD>
*******************************************************************************/
static mem_st mem_dev ={
.g_s32BspDevMajor = 0,
.g_u32CacheCoherent = 0,
.g_devno = 0,
};
static struct file_operations g_struBspOp = {
.owner = THIS_MODULE,
.read = mem_bsp_read,
.write = mem_bsp_write,
.open = mem_bsp_open,
.release = mem_bsp_release,
.mmap = mem_bsp_mmap,
.unlocked_ioctl = mem_bsp_ioctl,
};
static int osp_mem_init(void)
{
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ý<EFBFBD><C3BD><EFBFBD>*/
int result;
/*<2A><EFBFBD><E8B1B8><EFBFBD><EFBFBD>*/
dev_t devno;
printk("bsp_init.\n");
/* <20><>ȡ<EFBFBD><EFBFBD><E8B1B8> */
if (0 == mem_dev.g_s32BspDevMajor)
{
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD> */
result = alloc_chrdev_region(&devno, 0, 1, BSP_DEV_NAME);
/* <20>жϷ<D0B6><CFB7><EFBFBD>ֵ */
if (result < 0)
{
printk(KERN_WARNING "bsp: alloc_chrdev_region error! errno = %d\n", result);
return result;
}
mem_dev.g_devno = devno;
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD>Ϣ */
mem_dev.g_s32BspDevMajor = MAJOR(devno);
/* <20><>ʼ<EFBFBD><CABC>dev<65><76><EFBFBD><EFBFBD> */
cdev_init(&(mem_dev.g_struBspDev), &g_struBspOp);
/* <20>豸dev<65><76>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>ֵ */
mem_dev.g_struBspDev.owner = THIS_MODULE;
mem_dev.g_struBspDev.ops = &g_struBspOp;
/* <20><>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD>dev<65>豸 */
result = cdev_add(&mem_dev.g_struBspDev, devno, 1);
if (result < 0)
{
printk ("cdev_add error!errno = %d", result);
}
// ret = device_create_file(ucp_smem_miscdev.this_device, &dev_attr_ucp_smem);
mem_dev.cls = class_create(THIS_MODULE, "mem_dump");
device_create(mem_dev.cls, NULL, devno, NULL, "mem_dump");
printk("bsp module init success!\n");
/* <20><><EFBFBD>سɹ<D8B3> */
return 0;
}
else
{
printk("bsp module already init!\n");
/* <20><><EFBFBD><EFBFBD> */
return -EBUSY;
}
}
/*******************************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: ad9371_exit
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>: ģ<EFBFBD><EFBFBD>ж<EFBFBD>غ<EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:void
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ: <EFBFBD><EFBFBD>
* ˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*******************************************************************************/
static void osp_mem_exit(void)
{
/* <20>ж<EFBFBD><D0B6>Ƿ<EFBFBD>ִ<EFBFBD>й<EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
if(mem_dev.g_s32BspDevMajor > 0)
{
/* ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7>豸 */
device_destroy(mem_dev.cls, mem_dev.g_devno);
class_destroy(mem_dev.cls);
cdev_del(&(mem_dev.g_struBspDev));
/* <20>ͷ<EFBFBD><CDB7>ѷ<EFBFBD><D1B7><EFBFBD><EFBFBD>Ŀռ<C4BF> */
unregister_chrdev_region(MKDEV(mem_dev.g_s32BspDevMajor, 0), 1);
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8> */
mem_dev.g_s32BspDevMajor = 0;
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD> */
printk("bsp module cleanup success!\n");
}
return;
}
/*******************************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: ad9731_bsp_open
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:int
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
*
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* -------- ---- --- -----------
* inode struct inode* input <EFBFBD>ļ<EFBFBD><EFBFBD>ڵ<EFBFBD><EFBFBD>
* filp struct file* input <EFBFBD>ļ<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
* 0 <EFBFBD>ɹ<EFBFBD>
* ˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*******************************************************************************/
int mem_bsp_open(struct inode *inode, struct file *filp)
{
return 0;
}
/*******************************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: ad9731_bsp_release
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <EFBFBD>ر<EFBFBD><EFBFBD>ļ<EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:int
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
*
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* -------- ---- --- -----------
* inode struct inode* input <EFBFBD>ļ<EFBFBD><EFBFBD>ڵ<EFBFBD><EFBFBD>
* filp struct file* input <EFBFBD>ļ<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
* 0 <EFBFBD>ɹ<EFBFBD>
* ˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*******************************************************************************/
int mem_bsp_release(struct inode *inode, struct file *filp)
{
/* <20><><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD> */
return 0;
}
/*******************************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: ad9731_bsp_read ()
*
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>: <<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˺<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Э<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ơ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Э<EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>λ<EFBFBD><EFBFBD>>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
*******************************************************************************/
static ssize_t mem_bsp_read (struct file *filp, char *buf, size_t count, loff_t *f_pos)
{
return 0;
}
/*******************************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: ad9731_bsp_write ()
*
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>: д<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>: <<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˺<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Э<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ơ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Э<EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>λ<EFBFBD><EFBFBD>>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
*******************************************************************************/
ssize_t mem_bsp_write(struct file *filp, const char *buf, size_t count, loff_t *f_pos)
{
return 0;
}
/*******************************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: ad9731_bsp_ioctl
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>: IO<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:int
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
*******************************************************************************/
long mem_bsp_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
{
return 0;
}
/*******************************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: mem_bsp_mmap
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>: IO<EFBFBD>ڴ<EFBFBD>ӳ<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:int
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
*
*******************************************************************************/
int mem_bsp_mmap(struct file *filp, struct vm_area_struct *vma)
{
/* <20><><EFBFBD><EFBFBD>IO<49><4F>־ */
vma->vm_flags |= VM_IO;
vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
printk("mmap start\n\r");
/* <20><><EFBFBD><EFBFBD>ӳ<EFBFBD><D3B3> */
if (remap_pfn_range(vma,
vma->vm_start,
vma->vm_pgoff,
vma->vm_end-vma->vm_start,
vma->vm_page_prot) < 0)
{
return -EAGAIN;
}
return 0;
}
MODULE_AUTHOR ("mr yang");
MODULE_DESCRIPTION ("mem_dump" );
MODULE_LICENSE ("GPL");
module_init(osp_mem_init);
module_exit(osp_mem_exit);
/******************************* Դ<>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD> ***********************************/