📄 demo.c
字号:
/**************************************************************
demo.c
linux driver example for UP-netarm3000 & UP-netarm2410
It can be compiled for x86 PC
author: zou jian-guo <ah_zou@163.com>
date: 2004-8-20
***************************************************************/
//#define CONFIG_DEVFS_FS
#ifndef __KERNEL__
# define __KERNEL__
#endif
#ifndef MODULE
# define MODULE
#endif
#include <linux/config.h>
#include <linux/module.h>
#include <linux/devfs_fs_kernel.h>
#include <linux/init.h>
#include <linux/kernel.h> /* printk() */
#include <linux/slab.h> /* kmalloc() */
#include <linux/fs.h> /* everything... */
#include <linux/errno.h> /* error codes */
#include <linux/types.h> /* size_t */
#include <linux/proc_fs.h>
#include <linux/fcntl.h> /* O_ACCMODE */
#include <linux/poll.h> /* COPY_TO_USER */
#include <asm/system.h> /* cli(), *_flags */
#include <asm/uaccess.h>
#define DEVICE_NAME "mydemo"
#define mydemo_MAJOR 199
#define mydemo_MINOR 0
static int MAX_BUF_LEN=1024;
static char drv_buf[1024];
static int WRI_LENGTH=0;
/*************************************************************************************/
/*逆序排列缓冲区数据*/
static void do_write()
{
int i;
int len = WRI_LENGTH;
char tmp;
for(i = 0; i < (len>>1); i++,len--){
tmp = drv_buf[len-1];
drv_buf[len-1] = drv_buf[i];
drv_buf[i] = tmp;
}
}
/*************************************************************************************/
static ssize_t mydemo_write(struct file *filp,const char *buffer, size_t count)
{
if(count > MAX_BUF_LEN)count = MAX_BUF_LEN;
copy_from_user(drv_buf , buffer, count);
WRI_LENGTH = count;
printk("user write data to driver\n");
do_write();
return count;
}
/*************************************************************************************/
static ssize_t mydemo_read(struct file *filp, char *buffer, size_t count, loff_t *ppos)
{
if(count > MAX_BUF_LEN)
count=MAX_BUF_LEN;
copy_to_user(buffer, drv_buf,count);
printk("user read data from driver\n");
return count;
}
/*************************************************************************************/
static int mydemo_ioctl(struct inode *inode, struct file *file,
unsigned int cmd, unsigned long arg)
{
printk("ioctl runing\n");
switch(cmd){
case 1:printk("runing command 1 \n");break;
case 2:printk("runing command 2 \n");break;
default:
printk("error cmd number\n");break;
}
return 0;
}
/*************************************************************************************/
static int mydemo_open(struct inode *inode, struct file *file)
{
sprintf(drv_buf,"device open sucess!\n");
printk("device open sucess!\n");
return 0;
}
/*************************************************************************************/
static int mydemo_release(struct inode *inode, struct file *filp)
{
MOD_DEC_USE_COUNT;
printk("device release\n");
return 0;
}
/*************************************************************************************/
static struct file_operations mydemo_fops = {
owner: THIS_MODULE,
write: mydemo_write,
read: mydemo_read,
ioctl: mydemo_ioctl,
open: mydemo_open,
release: mydemo_release,
};
/*************************************************************************************/
#ifdef CONFIG_DEVFS_FS
static devfs_handle_t devfs_demo_dir, devfs_demoraw;
#endif
/*************************************************************************************/
//int init_module(void) //demo_init(void)
static int mydemo_init(void)
{
#ifdef CONFIG_DEVFS_FS
devfs_demo_dir = devfs_mk_dir(NULL, "mydemo", NULL);
devfs_demoraw = devfs_register(devfs_demo_dir, "0", DEVFS_FL_DEFAULT,
mydemo_MAJOR, mydemo_MINOR, S_IFCHR | S_IRUSR | S_IWUSR,
&mydemo_fops, NULL);
#else
int result;
SET_MODULE_OWNER(&mydemo_fops);
result = register_chrdev(mydemo_MAJOR, "mydemo", &mydemo_fops);
if (result < 0) printk(DEVICE_NAME " initialized failed \n"); //return result;
// if (mydemo_MAJOR == 0) mydemo_MAJOR = result; /* dynamic */
#endif
printk(DEVICE_NAME " initialized\n");
return 0;
}
/*************************************************************************************/
//int cleanup_module(void) //demo_exit(void)
static int mydemo_exit(void)
{
unregister_chrdev(mydemo_MAJOR, "mydemo");
//kfree(demo_devices);
printk(DEVICE_NAME " unloaded\n");
}
/*************************************************************************************/
module_init(mydemo_init);
module_exit(mydemo_exit);//MODULE_DESCRIPTION("My demo driver:^_^");//MODULE_LICENSE("GPL");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -