289 lines
7.6 KiB
C
289 lines
7.6 KiB
C
![]() |
|
|||
|
#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> ***********************************/
|
|||
|
|