日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux下的第一个驱动程序

發布時間:2024/9/3 linux 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux下的第一个驱动程序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

makefile文件:

[cpp]?view plaincopy
  • 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??

  • 驅動程序:

    [cpp]?view plaincopy
  • /*************************************************?
  • *?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");??

  • 測試程序:

    [cpp]?view plaincopy
  • /*************************************************?
  • *?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@FriendlyARM /home]#?
    [root@FriendlyARM /home]# ls /dev/first_drv_dev -l
    crw-rw---- ? ?1 root ? ? root ? ? 253, ? 0 Jan ?1 08:31 /dev/first_drv_dev
    [root@FriendlyARM /home]#?
    [root@FriendlyARM /home]# cat /proc/devices | grep first_drv ? ?
    253 first_drv_proc
    [root@FriendlyARM /home]#?
    [root@FriendlyARM /home]# ls /sys/class/first_drv_sys/
    first_drv_dev
    [root@FriendlyARM /home]#?
    [root@FriendlyARM /home]#?
    [root@FriendlyARM /home]# ./app?
    First_drv_open
    fd = 3
    First_drv_write
    First_drv_read
    First_drv_release
    [root@FriendlyARM /home]#?
    [root@FriendlyARM /home]#?

    ?OVER! THANK YOU !

    總結

    以上是生活随笔為你收集整理的Linux下的第一个驱动程序的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。