早期字符設備注冊


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);


}

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: