1.驱动程序hello.c代码如下
-
//moudle.h 包含了大量加载模块需要的函数和符号的定义
-
#include <linux/module.h>
-
//kernel.h以便使用printk()等函数
-
#include <linux/kernel.h>
-
//fs.h包含常用的数据结构,如struct file等
-
#include <linux/fs.h>
-
//uaccess.h 包含copy_to_user(),copy_from_user()等函数
-
#include <linux/uaccess.h>
-
//io.h 包含inl(),outl(),readl(),writel()等IO口操作函数
-
#include <linux/io.h>
-
#include <linux/miscdevice.h>
-
#include <linux/pci.h>
-
//init.h来指定你的初始化和清理函数,例如:module_init(init_function)、module_exit(cleanup_function)
-
#include <linux/init.h>
-
#include <linux/delay.h>
-
#include <linux/device.h>
-
#include <linux/cdev.h>
-
#include <linux/gpio.h>
-
#include <linux/irq.h>
-
#include <linux/sched.h>
-
#include <linux/interrupt.h>
-
#include <linux/poll.h>
-
//irq.h中断与并发请求事件
-
#include <asm/irq.h>
-
//下面这些头文件是IO口在内核的虚拟映射地址,涉及IO口的操作所必须包含
-
//#include <mach/gpio.h>
-
#include <mach/regs-gpio.h>
-
#include <plat/gpio-cfg.h>
-
#include <mach/hardware.h>
-
#include <mach/map.h>
-
-
-
static struct class *hello_class;
-
static int major;
-
-
static int hello_open(struct inode *inode, struct file *file)
-
{
-
printk("this is hello_open!\n");
-
return 0;
-
}
-
-
static ssize_t hello_write(struct file *file, const char __user *buf, size_t count, loff_t * ppos)
-
{
-
printk("this is hello_write!\n");
-
return 0;
-
}
-
-
static struct file_operations hello_fops = {
-
.owner = THIS_MODULE, /* 这是一个宏,推向编译模块时自动创建的__this_module变量 */
-
.open = hello_open,
-
.write = hello_write,
-
};
-
-
static int hello_init(void)
-
{
-
major = register_chrdev(0, "hello_dev", &hello_fops);//注册,告诉内核
-
hello_class = class_create(THIS_MODULE, "hello_cls");
-
device_create(hello_class, NULL, MKDEV(major, 0), NULL, "hello");/* /dev/hello */
-
return 0;
-
}
-
-
static void hello_exit(void)
-
{
-
unregister_chrdev(major, "hello_cls");
-
device_destroy(hello_class, MKDEV(major, 0));
-
class_destroy(hello_class);
-
}
-
-
module_init(hello_init);
-
module_exit(hello_exit);
-
-
MODULE_LICENSE("GPL");
2.Makefile文件代码如下
/home/ymseven/work6410/linux/linux-3.8.3是开发板作用内核源代码的目录
-
KERN_DIR = /home/ymseven/work6410/linux/linux-3.8.3
-
-
all:
-
make -C $(KERN_DIR) M=`pwd` modules
-
-
clean:
-
make -C $(KERN_DIR) M=`pwd` modules clean
-
rm -rf modules.order
-
-
obj-m += hello.o
3.编译
把hello.c和Makefile放到同一文件夹下,执行make,可看到生成了hello.ko文件,把hello.ko文件拷贝到开发板上
在开发板上执行insmod hello.ko命令,驱动就装载成功了
在开发板上执行 cat /proc/devices 命令,可看到有hello_dev这个设备
在开发板上执行 ls -l /dev/he* 命令,可看到/dev/hello 字符设备的详细信息
在开发板山执行rmmod hello 命令,就可以卸载驱动
4.测试程序hello_test.c如下
-
#include <sys/types.h>
-
#include <sys/stat.h>
-
#include <fcntl.h>
-
#include <stdio.h>
-
-
-
int main(int argc, char **argv)
-
{
-
int fd;
-
int val = 1;
-
fd = open("/dev/hello", O_RDWR);
-
if (fd < 0)
-
printf("can't open!\n");
-
write(fd, &val, 4);
-
return 0;
-
}
5.测试
在hello_test.c的目录下执行arm-linux-gcc -o hello_test hello_test.c ,编译出hello_test文件,把它拷贝到开发板
执行./hello_test , 可看到打印出this is hello_open!和this is hello_write!
测试成功。
阅读(836) | 评论(0) | 转发(0) |