• 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   成功!

  • 相关阅读:
    Nginx优化
    Mysql日常操作
    YUM源
    MySQL5.7安装手册
    自律——可以让我们活的更高级
    javascript中with的用法
    js中所有函数的参数(按值和按引用)都是按值传递的,怎么理解?
    base64编码的图片在网页中显示
    form表单提交没有跨域问题,但ajax提交存在跨域问题
    移动端1px的适配问题
  • 原文地址:https://www.cnblogs.com/cxd2014/p/4167807.html
Copyright © 2020-2023  润新知