早期字符设备注册

led驱动

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <asm/uaccess.h>
#include <asm/io.h>

static unsigned int led_major;

//根据自己硬件写led驱动

#define GPM4_DAT_PHYADDR 0X110002E4
#define GPM4_CON_PHYADDR 0X110002E0

typedef struct GPIO{

  volatile unsigned long gpm4con;
  volatile unsigned long gpm4dat;

}GPIO_t ,*GP;
static GPIO_t *GPM4=NULL;

// 7 编写文件操作函数
static ssize_t led_write(struct file *file, const char __user *buf, size_t count, loff_t *offsets)
{
  unsigned char ledflag[2]={0};
//接收函数// 8 接收上层数据
  unsigned long ret = copy_from_user(ledflag,buf,count);

  printk(KERN_WARNING "driver ledflag :%d",ledflag[0]);
  printk(KERN_WARNING "driver ledflag :%d\n",ledflag[1]);

  if(ledflag[1]==1)
  {
    if (ledflag[0]==1)
      GPM4->gpm4dat &=~(1<<0);
    else if (ledflag[0]==2)
      GPM4->gpm4dat &=~(1<<1);
    else if (ledflag[0]==3)
      GPM4->gpm4dat &=~(1<<2);
    else if (ledflag[0]==4)
      GPM4->gpm4dat &=~(1<<3);
  }
  else
  {
    if (ledflag[0]==1)
      GPM4->gpm4dat |=(1<<0);
    else if (ledflag[0]==2)
      GPM4->gpm4dat |=(1<<1);
    else if (ledflag[0]==3)
      GPM4->gpm4dat |=(1<<2);
    else if (ledflag[0]==4)
      GPM4->gpm4dat |=(1<<3);
  }

  return ret;
}

// 4 构造file_operation文件操作集合
// 6 填充文件操作集合

struct file_operations led_fops =
{
  .owner = THIS_MODULE,

  .write = led_write,

};

// 2 编写驱动加载卸载函数
static int __init led_drv_init(void)
{

// 3 早期字符设备注册
// 参数1:主设备号 >0 静态注册 以写入的设备号注册
// =0 动态注册 自动分配一个设备号
// 参数2:名称 辅助识别
// 参数3:文件操作集合 驱动支持的上层操作接口
// 返回:静态注册 成功返回0 失败返回错误
// 动态注册 成功返回分配的主设备号

  led_major= register_chrdev(0,"leddrv",&led_fops);

  printk("led insmod....\n");

  GPM4 = ioremap(GPM4_CON_PHYADDR, 8);

//led初始化

  GPM4->gpm4con |=0X1111<<0;
  GPM4->gpm4dat |=0XF<<0;
  return 0;

}

static void __exit led_drv_exit(void)
{

  unregister_chrdev(led_major,"leddrv");

// 9 取消硬件映射
  iounmap(GPM4);

  printk("led rmmod....\n");

}

//指点加载程序入口
module_init(led_drv_init);
module_exit(led_drv_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("qw");

上层应用ledapp.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

int main(int argc,char *argv[])
{
  int led_fd;
  unsigned char ledflag[2]={0};

if(argc !=3)
{
  printf("Use: %s </dev/led> <11/10/21/20/31/30/41/40>\n",argv[0]);
}

led_fd = open(argv[1],O_WRONLY);

  ledflag[0] = argv[2][0]-48;
  ledflag[1] = argv[2][1]-48;
  write(led_fd,ledflag,2);

}

时间: 2024-08-27 07:15:18

早期字符设备注册的相关文章

字符设备注册/注销

字符设备注册步骤: 1.分配cdev结构体 2.分配设备号,register_chrdev_region()/alloc_chrdev_region(); 3.添加设备到系统,cdev_add(); 字符设备注销步骤: 1. 从系统中删除设备,cdev_del(); 2. 释放设备号,unregister_chrdev_region(); 除了以上按步骤注册/注销字符设备外,系统也提供了函数直接完成设备的注册与注销. 1 /** 2 * __register_chrdev() - create

Linux字符设备驱动注册流程

其中一部分从伯乐在线和网络上摘抄的内容,不用于商业用途. 一.linux系统将设备分为3类:字符设备.块设备.网络设备. 字符设备:是指只能一个字节一个字节读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后数据.字符设备是面向流的设备,常见的字符设备有鼠标.键盘.串口.控制台和LED设备等. 块设备:是指可以从设备的任意位置读取一定长度数据的设备.块设备包括硬盘.磁盘.U盘和SD卡等. 每一个字符设备或块设备都在/d ev目录下对应一个设备文件.linux用户程序通过设备文件(或

使用register_chrdev注册字符设备

1.2.2  使用register_chrdev注册字符设备 注册字符设备可以使用register_chrdev函数. int register_chrdev (unsigned int major, const  char *name, struct file_operations*fops); register_chrdev函数的major参数如果等于0,则表示采用系统动态分配的主设备号. 注销字符设备可以使用unregister_chrdev函数. int unregister_chrde

002_linux驱动之_register_chrdev注册字符设备

(一)解析:register_chrdev函数和unregister_chrdev函数 (二)register_chrdev函数原型 int register_chrdev(unsigned int major, const char *name,const struct file_operations *fops) * register_chrdev() -为字符设备注册一个主号码. * @major:用于动态分配的主要设备号或0 * @name:这一系列设备的名称 * @fops:与此设备相

驱动笔记 - 字符设备常用函数

字符设备: 静态申请设备号int register_chrdev_region(dev_t from, unsigned count,const char *name)申请使用从from开始的count个设备号(主设备号不变,次设备号增加)from:希望申请使用的设备号count:希望申请使用的设备号数目name:设备文件 动态分配设备号int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const ch

Samsung_tiny4412(笔记)--&gt;字符设备驱动基本操作及调用流程

/*********************************************************************************** * * Samsung_tiny4412(笔记)-->字符设备驱动基本操作及调用流程 * * 声明: * 以下所有的shell命令都是在root权限下运行的; * * 2015-3-7 阴 深圳 尚观 Sbin 曾剑锋 *******************************************************

7、字符设备系统

一.字符设备驱动的结构 1.cdev 结构体 struct cdev {                 struct kobject kobj;    // 内嵌的Kobject对象                 struct module *owner;  // 所属的模块                 const struct file_operations *ops;  // 文件操作结构体                 struct list_head list;  // 内核维

linux字符设备驱动程序框架

#include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> #include <linux/fs.h> #include <linux/delay.h> #include <asm/uaccess.h> #include <asm/irq.h> #include <asm/io.h> #include <asm/a

Linux杂项设备与字符设备

.1 杂项设备驱动的引入 字符设备指那些必须以串行顺序依次进行访问,且没有经过系统快速缓冲的设备,了解了Linux内核中驱动的框架和组成,以及编写的步骤等.但是,当我们写的驱动程序多了之后,就会发现:部分硬件并不符合预先定义的字符设备的范畴,而且普通字符设备的主设备号不管是静态分配还是动态分配,都会消耗一个主设备号(目前一个系统最多只能有255个字符设备),比较浪费主设备号资源.因此,而引入了杂项设备驱动. 杂项设备是一个典型的字符设备(与接下来要介绍的输入子系统一样,呵呵),其主设备号固定为1