zoukankan      html  css  js  c++  java
  • 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   成功!

  • 相关阅读:
    Http相应代码及获取方法
    (转) SQL 命令
    vue 设置动态class
    elment-ui中 给table表格 某项加点击事件
    VUE 中封装组件
    导出 搜索出的对应条件下的 内容(地址栏中携带多多个数据)
    element ui+vue 后台管理系统的新增数据页面崩溃(处理下拉数据过多)
    VUE+百度地图 vue-baidu-map
    用javascript制作秒表(有一个小问题,复位的时候,毫秒从01开始)
    左右两列导航分开滑动(移动端中)
  • 原文地址:https://www.cnblogs.com/cxd2014/p/4167807.html
Copyright © 2011-2022 走看看