一、一个简单的驱动程序实例

led_drv.c 驱动文件:

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <asm/uaccess.h>
#include <asm/irq.h>
#include <asm/io.h>
#include <asm/arch/regs-gpio.h>
#include <asm/hardware.h>

#define DEVICE_MAJOR 111
#define DRIVER_NAME "led_drv"

int led_open(struct inode *inode, struct file *file)
{
  printk(KERN_EMERG "led_drv_open.\n");
  return 0;
}

int led_write(struct file *file, const char __user *buf, size_t count, loff_t * ppos)
{
  printk(KERN_EMERG "led_drv_write.\n");
  return 0;
}

int led_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
{
  printk(KERN_EMERG "led_drv_read.\n");
  return 0;
}

static struct file_operations led_fopt = {
  .open = led_open,
  .write = led_write,
  .read = led_read,
};

int __init led_init()
{
  int ret;
  ret = register_chrdev(DEVICE_MAJOR, DRIVER_NAME, &led_fopt);      //注册驱动
  if(ret<0)
  {
    printk(KERN_EMERG "can't register major number.\n");
    return ret;
  }
  return 0;
}

void __exit led_exit()
{
  unregister_chrdev(DEVICE_MAJOR, DRIVER_NAME);               //卸载驱动
}

module_init(led_init);

module_exit(led_exit);

MODULE_LICENSE("GPL");

Makefile 文件:

obj-m += led_drv.o

KERN_DIR = /work/system/linux-2.6.22.6

all:
  make -C $(KERN_DIR) M=`pwd` modules

clean:
  make -C $(KERN_DIR) M=`pwd` modules clean
  rm -rf modules.order

使用 make 命令编译,生成 led_drv.ko, 拷贝 led_drv.ko 至 U 盘, 使用 mount /dev/sda1 /mnt/usb 命令加载 U 盘( mnt 下无 usb 目录需提前新建 )

加载模块 insmod led_drv.ko

卸载模块 rmmod led_drv 

led_app 测试文件:  

#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/led_dev", O_RDWR);
  if(fd<0)
  {
    printf("can not open \n");
  }

  write(fd, &val, 4);
  read(fd, &val, 4);
  return 0;
}

使用 arm-linux-gcc -o led_app led_app.c 命令编译 ( 这里只有一个文件就不写 Makefile 了 ), 生成 led_app 拷贝至 U 盘, 并加载  U 盘

重新加载模块 insmod led_drv.ko

运行 ./led_app 发现控制台打印 can not open, 这是因为虽然有了设备驱动, 但是没有设备文件, 所以 open 失败, 因此要先创建设备文件

创建设备文件:

    mknod /dev/led_dev c 111 0

  其中led_dev为设备文件(设备节点)的名称, c表示次设备为字符设备, 111表示该设备所对应的主设备号为111, 0表示该设备的次设备号为0

  运行 ./led_app, 控制台输出:

    led_drv_open.

    led_drv_write.

    led_drv_read.

       

Linux 驱动——从宏观上掌握基本框架的更多相关文章

  1. 嵌入式Linux驱动笔记(十八)------浅析V4L2框架之ioctl【转】

    转自:https://blog.csdn.net/Guet_Kite/article/details/78574781 权声明:本文为 风筝 博主原创文章,未经博主允许不得转载!!!!!!谢谢合作 h ...

  2. 【SpringMVC学习01】宏观上把握SpringMVC框架

    springmvc是一个基于mvc的web框架,是spring框架的一个模块,所以springmvc和spring无需通过中间整合层进行整合.我们先来看下spring的一个架构模型,看springmv ...

  3. 【MyBatis学习01】宏观上把握MyBatis框架

    今天开始学习mybatis框架,博客主要记录学习过程中的一些总结,如有错误之处,欢迎留言指正~先用mybatis的鸟鸟来镇个楼,咳咳~~ mybatis框架是一个持久层框架,是Apache下的顶级项目 ...

  4. Linux驱动修炼之道-RTC子系统框架与源码分析【转】

    转自:http://helloyesyes.iteye.com/blog/1072433 努力成为linux kernel hacker的人李万鹏原创作品,为梦而战.转载请标明出处 http://bl ...

  5. Gt9xx芯片,在规格书+Linux驱动的基础上,移植为USB裸机经验。直接用开发板,不去碰硬件的坑。

    1,用内核代码和规格书来印证数据格式: //命令3字节,IC地址 u8 end_cmd[] = {GTP_READ_COOR_ADDR >> , GTP_READ_COOR_ADDR &a ...

  6. Linux内核(17) - 高效学习Linux驱动开发

    这本<Linux内核修炼之道>已经开卖(网上的链接为: 卓越.当当.china-pub ),虽然是严肃文学,但为了保证流畅性,大部分文字我还都是斟词灼句,反复的念几遍才写上去的,尽量考虑到 ...

  7. Linux 驱动框架---input子系统

    input 子系统也是作为内核的一个字符设备模块存在的,所以他也是字符设备自然也会有字符设备的文件接口.input子系统的注册过程主要分为两步,先注册了一个input class然后再注册一个字符设备 ...

  8. linux驱动学习(八) i2c驱动架构(史上最全) davinc dm368 i2c驱动分析【转】

    转自:http://blog.csdn.net/ghostyu/article/details/8094049 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 预备知识 lin ...

  9. linux驱动基础系列--linux spi驱动框架分析

    前言 主要是想对Linux 下spi驱动框架有一个整体的把控,因此会忽略某些细节,同时里面涉及到的一些驱动基础,比如平台驱动.设备模型等也不进行详细说明原理.如果有任何错误地方,请指出,谢谢! spi ...

随机推荐

  1. PHP5.6 Dockerfile

    FROM centos COPY ["src","/src"] RUN groupadd -g 1000 www \ && useradd -u ...

  2. 【Alpha】Scrum Meeting 1

    前言 第1次会议在3月17日由PM在教一317召开. 主要确定了选题,并对目标进行了初步的确定.时长90min. 任务分配 姓名 当前阶段任务 下阶段任务 吴昊 确定项目方向,本地部署代码,完成团队介 ...

  3. HBase运维实践-聊聊RIT的那点事

    相信长时间运维HBase集群的童鞋肯定都会对RIT(Region-In-Transition,很多参考资料误解为Region-In-Transaction,需要注意)有一种咬牙切齿的痛恨感,一旦Reg ...

  4. Linux PWM framework简介和API描述【转】

    本文转载自:https://blog.csdn.net/mike8825/article/details/51656400 1. 前言 PWM是Pulse Width Modulation(脉冲宽度调 ...

  5. 聚合函数与F/Q表达式

    聚合函数 取名: field + __ + 聚合函数名字 ,如:price__avg:可传关键字参数修改名字:avg=Avg("price"): aggregate:不会返回一个  ...

  6. Qt 从菜单栏打开文件

    Qt从菜单栏的下拉菜单选择文件 构造函数中设置打开动作信息 //打开文件 m_menu = ui.menu; // m_menu->menuAction = new QAction(QIcon( ...

  7. Spring.Net —IOC详解

    一. Spring.net中IOC介绍 1. 什么是IOC,控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度.其中 ...

  8. CSP中的选择

    P ∩ Q (P or Q) 由机器做出选择,环境无法控制,设计软件时只实现一个即可 P[]Q一般选择(Genral choice) 环境可以控制选择P或Q,若P不可接受这个动作,则执行Q,若Q不可接 ...

  9. submit form to convert to a Java Bean model.

    实体类中无需构造函数. Since we haven’t specified a constructor, Java will provide a default constructor that w ...

  10. 文献导读 | A Pan-Cancer Analysis of Enhancer Expression in Nearly 9000 Patient Samples

    Chen, H., Li, C., Peng, X., Zhou, Z., Weinstein, J.N., Liang, H. and Cancer Genome Atlas Research Ne ...