Linux下的第一个驱动程序(模板)
Linux下的第一个驱动程序(模板)
makefile文件:
- KERN_DIR = /home/youshan/linux-2.6.32.2
- all:
- make -C $(KERN_DIR) M=`pwd` modules
- clean:
- make -C $(KERN_DIR) M=`pwd` modules clean
- rm -rf modules.order
- obj-m += first_drv.o
- /*************************************************
- * File name : first_drv.c(可当做模板使用)
- * Description : 参考韦东山视频,改写了部分代码
- * Author : sg131971@qq.com
- * Version : V1.0
- * Date :
- * Compiler : arm-linux-gcc-4.4.3
- * Target : mini2440(Linux-2.6.32)
- * History :
- * <author> <time> <version > <desc>
- *************************************************/
- #include <linux/module.h>
- #include <linux/types.h>
- #include <linux/fs.h>
- #include <linux/errno.h>
- #include <linux/mm.h>
- #include <linux/sched.h>
- #include <linux/init.h>
- #include <linux/cdev.h>
- #include <asm/io.h>
- #include <asm/system.h>
- #include <asm/uaccess.h>
- #include <linux/device.h> /* device_create() */
- static struct class *firstdrv_class;
- static struct class_device *firstdrv_class_dev;
- static int major;
- static int first_drv_open(struct inode *inode, struct file *file)
- {
- printk("First_drv_open\n");
- return 0;
- }
- static ssize_t first_drv_read(struct file *file, const char __user *buf, size_t count, loff_t * ppos)
- {
- printk("First_drv_read\n");
- return 0;
- }
- static ssize_t first_drv_write(struct file *file, const char __user *buf, size_t count, loff_t * ppos)
- {
- printk("First_drv_write\n");
- return 0;
- }
- static int first_drv_release(struct inode *inode, struct file *file)
- {
- printk("First_drv_release\n");
- return 0;
- }
- static struct file_operations first_drv_fops = {
- .owner = THIS_MODULE,
- .open = first_drv_open,
- .read = first_drv_read,
- .write = first_drv_write,
- .release = first_drv_release,
- };
- static int __init first_drv_init(void)
- {
- /* cat /proc/devices */
- major = register_chrdev(0, "first_drv_proc", &first_drv_fops);
- /* ls /sys/class/first_drv */
- firstdrv_class = class_create(THIS_MODULE, "first_drv_sys");
- if (IS_ERR(firstdrv_class))
- return PTR_ERR(firstdrv_class);
- /* ls /dev/first_drv */
- firstdrv_class_dev = device_create(firstdrv_class, NULL, MKDEV(major, 0), NULL, "first_drv_dev");
- if (unlikely(IS_ERR(firstdrv_class_dev)))
- return PTR_ERR(firstdrv_class_dev);
- return 0;
- }
- static void __exit first_drv_exit(void)
- {
- unregister_chrdev(major, "first_drv_proc");
- device_unregister(firstdrv_class_dev);
- class_destroy(firstdrv_class);
- }
- module_init(first_drv_init);
- module_exit(first_drv_exit);
- MODULE_AUTHOR("WHUT-ShiGuang");
- MODULE_DESCRIPTION("Mini2440 Test Driver");
- MODULE_VERSION("1.0");
- MODULE_LICENSE("GPL");
- /*************************************************
- * File name :
- * Description :
- * Author : sg131971@qq.com
- * Version : V1.0
- * Date :
- * Compiler : arm-linux-gcc-4.4.3
- * Target : mini2440(Linux-2.6.32)
- * History :
- * <author> <time> <version > <desc>
- *************************************************/
- #include<stdio.h>
- #include<stdlib.h>
- #include<fcntl.h>
- #include<sys/types.h>
- #include<sys/stat.h>
- int main()
- {
- int fd;
- int val = 1;
- fd = open("/dev/first_drv_dev", O_RDWR);
- printf("fd = %d\n", fd);
- write(fd, &val, 4);
- read(fd, &val, 4);
- close(fd);
- return 0;
- }
[root@ www.bkjia.com /home]#
[root@ www.bkjia.com /home]# ls /dev/first_drv_dev -l
crw-rw---- 1 root root 253, 0 Jan 1 08:31 /dev/first_drv_dev
[root@ www.bkjia.com /home]#
[root@ www.bkjia.com /home]# cat /proc/devices | grep first_drv
253 first_drv_proc
[root@ www.bkjia.com /home]#
[root@ www.bkjia.com /home]# ls /sys/class/first_drv_sys/
first_drv_dev
[root@ www.bkjia.com /home]#
[root@ www.bkjia.com /home]#
[root@ www.bkjia.com /home]# ./app
First_drv_open
fd = 3
First_drv_write
First_drv_read
First_drv_release
[root@ www.bkjia.com /home]#
[root@ www.bkjia.com /home]#
OVER! THANK YOU !
评论暂时关闭