Tiny6410下的第一个Linux驱动程序

Linux系统环境是照着友善之臂的教程搭建的

//Hello  World驱动程序源文件

 1 #include <linux/miscdevice.h>
 2 #include <linux/delay.h>
 3 #include <asm/irq.h>
 4 
 5 #include <mach/hardware.h>
 6 #include <linux/kernel.h>
 7 #include <linux/module.h>
 8 #include <linux/init.h>
 9 #include <linux/mm.h>
10 #include <linux/fs.h>
11 #include <linux/types.h>
12 #include <linux/delay.h>
13 #include <linux/moduleparam.h>
14 #include <linux/slab.h>
15 #include <linux/errno.h>
16 #include <linux/ioctl.h>
17 #include <linux/cdev.h>
18 #include <linux/string.h>
19 #include <linux/list.h>
20 #include <linux/pci.h>
21 #include <asm/uaccess.h>
22 #include <asm/atomic.h>
23 #include <asm/unistd.h>
24 
25 #include <mach/map.h>
26 #include <mach/regs-clock.h>
27 #include <mach/regs-gpio.h>
28 
29 #include <plat/gpio-cfg.h>
30 #include <mach/gpio-bank-e.h>
31 #include <mach/gpio-bank-k.h>
32 #include <asm/io.h>
33 #include <linux/device.h>

//驱动读函数
static int first_drv_open(struct inode *inode, struct file *file)
{
    printk("Hello Driver ");
    return 0;
}

//驱动写函数
static ssize_t first_drv_write(struct file *file, const char __user *buf, size_t count, loff_t * ppos)
{
    printk("Hello World ");
    return 0;
}

//定义file_operations结构体
static struct file_operations first_drv_fops =
{
   .owner  =   THIS_MODULE, //这是一个宏,推向编译模块时自动创建的__this_module变量
   .open   =   first_drv_open,     
    .write  =    first_drv_write,       
};

//驱动入口函数
static int first_drv_init(void)
{
    register_chrdev(111, "first_drv", &first_drv_fops);//向内核注册驱动
    return 0;
}

static void first_drv_exit(void)
{
    unregister_chrdev(111, "first_drv"); //卸载驱动
}

module_init(first_drv_init);//定义一个结构体,供内核调用入口函数(first_drv_init--函数指针)

module_exit(first_drv_exit);//

Makefile文件

obj-m    += first_drv.o    #制定目标名
KDIR = /opt/FriendlyARM/mini6410/linux/linux-2.6.38    #指定内核路径
all :
    make -C $(KDIR) M=$(PWD) modules CROSS_COMPILE=arm-linux- ARCH=arm
clean :
    rm -f *.ko *.o *.mod.o *.mod.c *.symvers *.bak *.order

//测试驱动的程序
//测试程序要用arm-linux-gcc来编译

 1 #include <sys/types.h>
 2 
 3 #include <sys/stat.h>
 4 
 5 #include <fcntl.h>
 6 
 7 #include <stdio.h>
 8 
 9 int main(int argc, char **argv)
10 {
11     int fd;
12     int val = 1;
13     fd = open("/dev/xxx", O_RDWR);
14     if (fd < 0)
15     {
16         printf("can't open!
");
17     }
18     
19     write(fd, &val, 4);
20     return 0;
21 }

加载内核步骤

1、将编译好的驱动文件--first_drv.ko  和测试程序--firstdevtest  发送到Tiny6410上。

2、执行命令   insmod first_drv.ko   //加载内核驱动     使用  cat /proc/devices  命令查看加载的驱动

3、执行命令   mknod /dev/xxx c 111 0  //创建设备节点   在/dev目录下生成xxx文件   主设备号为111 次设备号为0

4、执行命令   ./firstdrvtest     //执行测试程序  出现Hello Wrold   成功!

原文地址:https://www.cnblogs.com/cxd2014/p/4167807.html