注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

deisp的博客

 
 
 

日志

 
 

驱动(测试)程序原始样板  

2008-06-01 23:30:58|  分类: 驱动程序 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

驱动程序:
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/string.h>
#include <linux/init.h>
#include <linux/device.h>
#include <linux/interrupt.h>
#include <linux/rtc.h>
#include <linux/bcd.h>
#include <linux/delay.h>
#include <linux/devfs_fs_kernel.h>

#include <asm/hardware.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#include <asm/irq.h>
#include <asm/rtc.h>
#include <asm/mach/time.h>
#include <asm/hardware/clock.h>
#include <asm/arch/regs-gpio.h>


#define   LED1  0x01
#define   LED2  0x02
#define   LED3  0x04
#define   LED4  0x08

static int matar_test= 0;//主设备号为0时注册设备为自动分配
static unsigned char led_status = 0;

static void set_led_status(unsigned char status)
{

.........................

}

static int matrix_led_open(struct inode *inode,struct file *filp)
{
 return 0;
}

static int matrix_led_release(struct inode *inode,struct file *filp)
{
 return 0;
}

static ssize_t matrix_led_read(struct file *filp,char *buff,size_t count,loff_t *offp)
{
 copy_to_user(buff,(char *)&led_status,sizeof(unsigned char));
 return sizeof(unsigned char);
}

static ssize_t matrix_led_write(struct file *filp,const char *buff,size_t count,loff_t *offp)
{
 unsigned char status;
 if(count == 1)
 {
  if(copy_from_user(&status,buff,sizeof(unsigned char)))
   return -EFAULT;
  set_led_status(status);
  return sizeof(unsigned char);
 }
 else
  return -EFAULT;
}

static struct file_operations matrix_led_fops = {
 .owner  = THIS_MODULE,
 .open    = matrix_led_open,
 .read    = matrix_led_read,
 .write = matrix_led_write,
 .release = matrix_led_release,
};

static int __init matrix_led_init(void)//注册驱动
{
   int ret;

   ret = register_chrdev(matar_test,"test",&matrix_led_fops);//步骤1
      //注册设备的函数,各参数含义:
       matar_test=0:需要动态分配一个设备号,如果注册成功的话,把设备号返回出来,当然这个设备号以后卸载时要用到的
       test:所定义的设备名,自己定义,加载模块后就可以查到的。
       &matrix_led_fops:一个应用文件表,其中定义了通过映射怎么操作设备等等。

*/
 if(ret < 0)
 {
  printk("matrix_led: can't get major number\n");
  return ret;
 }
 matar_test = ret;
 //#ifdef CONFIG_DEVFS_FS  //如果在定义了CONFIG_DEVFS_FS是2.6内核  用在2.6时可省去
 ret = devfs_mk_cdev(MKDEV(matar_test,0),S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP,"test");
//步骤1 如何加载成功,则加载设备到文件系统,这步将生成一个次设备号
 if(ret) 
 {
  unregister_chrdev(matar_test,"test");
  printk("matrix_led: can't make char device fo devfs\n");
  return ret;
 }
 //#endif

//横坐标   硬初始化
 s3c2410_gpio_cfgpin(S3C2410_GPE11,S3C2410_GPE11_OUTP);
 s3c2410_gpio_cfgpin(S3C2410_GPG6,S3C2410_GPG6_OUTP);
 s3c2410_gpio_cfgpin(S3C2410_GPE13,S3C2410_GPE13_OUTP);
 s3c2410_gpio_cfgpin(S3C2410_GPG2,S3C2410_GPG2_OUTP);
 s3c2410_gpio_setpin(S3C2410_GPE11,1);
 s3c2410_gpio_setpin(S3C2410_GPG6,1);
 s3c2410_gpio_setpin(S3C2410_GPE13,1);
 s3c2410_gpio_setpin(S3C2410_GPG2,1);
//纵坐标
 s3c2410_gpio_cfgpin(S3C2410_GPF0,S3C2410_GPF0_OUTP);
 s3c2410_gpio_cfgpin(S3C2410_GPF2,S3C2410_GPF2_OUTP);
 s3c2410_gpio_cfgpin(S3C2410_GPG3,S3C2410_GPG3_OUTP);
 s3c2410_gpio_cfgpin(S3C2410_GPG11,S3C2410_GPG11_OUTP);
 s3c2410_gpio_setpin(S3C2410_GPF0,1);
 s3c2410_gpio_setpin(S3C2410_GPF2,1);
 s3c2410_gpio_setpin(S3C2410_GPG3,1);
 s3c2410_gpio_setpin(S3C2410_GPG11,1);
//指示灯
 s3c2410_gpio_cfgpin(S3C2410_GPF4,S3C2410_GPF4_OUTP);
 s3c2410_gpio_cfgpin(S3C2410_GPF5,S3C2410_GPF5_OUTP);
 s3c2410_gpio_cfgpin(S3C2410_GPF6,S3C2410_GPF6_OUTP);
 s3c2410_gpio_cfgpin(S3C2410_GPF7,S3C2410_GPF7_OUTP);
 s3c2410_gpio_setpin(S3C2410_GPF4,0);//指示灯开
 s3c2410_gpio_setpin(S3C2410_GPF5,0);
 s3c2410_gpio_setpin(S3C2410_GPF6,0);
 s3c2410_gpio_setpin(S3C2410_GPF7,0);
 
 led_status = 0x00;

 printk("led: the matrix led initialized\n");
 return 0;
}

static void __exit matrix_led_exit(void)//卸载驱动
{
 set_led_status(~(LED1 | LED2 | LED3 | LED4));
 //#ifdef CONFIG_DEVFS_FS  //如果在定义了CONFIG_DEVFS_FS是2.6内核  用在2.6时可省去
        devfs_remove("test");
 //#endif
 unregister_chrdev(matar_test,"test");
 printk("led: the matrix led driver exit\n");

//横坐标
 s3c2410_gpio_setpin(S3C2410_GPE11,0);
 s3c2410_gpio_setpin(S3C2410_GPG6,0);
 s3c2410_gpio_setpin(S3C2410_GPE13,0);
 s3c2410_gpio_setpin(S3C2410_GPG2,0);
//纵坐标
 s3c2410_gpio_setpin(S3C2410_GPF0,0);
 s3c2410_gpio_setpin(S3C2410_GPF2,0);
 s3c2410_gpio_setpin(S3C2410_GPG3,0);
 s3c2410_gpio_setpin(S3C2410_GPG11,0);
//指示灯
 s3c2410_gpio_setpin(S3C2410_GPF4,1);
 s3c2410_gpio_setpin(S3C2410_GPF5,1);
 s3c2410_gpio_setpin(S3C2410_GPF6,1);
 s3c2410_gpio_setpin(S3C2410_GPF7,1);

}

module_init(matrix_led_init);//系统引用
module_exit(matrix_led_exit);

MODULE_ALIAS("matrix_led");  //驱动模块名字
MODULE_DESCRIPTION("The Matrix LED Driver");//驱动模块描述
MODULE_AUTHOR("jjj.<jjjstudio@163.com>");//驱动模块作者
MODULE_LICENSE("GPL")//驱动模块著作权许可(公共)

测试程序:

#include <linux/fcntl.h>
#include <linux/kernel.h>

/*
#include <linux/module.h>
#include <linux/devfs_fs_kernel.h>
#include <linux/delay.h>

#include <asm/uaccess.h>
#include <asm/hardware.h>
#include <asm/arch/regs-gpio.h>
*/
#define uchar unsigned char
#define uint unsigned int
static uchar  read_txt[48];
static uchar write_for_dev[35]="I from in test!";

static struct my_jk
 {
         int kkk;
 }  kjk;
static struct my_jk *kk;

int main(int argc, char** argv)
 {
 uchar read_size=7;
 uchar write_size=35;
 uchar dev_return_size;
 uchar dev_write_return_size;
 uint any=0;
 int ret0=0;
 kk=&kjk;
 kk->kkk=2;
 ret0=open("/dev/test", O_RDWR);
  if (ret0>0)
  {
  printf("test: open dev success !\n");
//////read 读驱动////////
  //读取指定个数的字节
  dev_return_size=read(ret0,read_txt,read_size);
//从驱动程序ret0空间读取read_size个字节,如成功,返回读取的字数。
  if(read_size==dev_return_size)
   {
                           //返回字节数相等,成功
   //printf("test:%s\n",read_txt);
   }
  else
   {
   //显示读取字数不对
   printf("test:read dev eroee!\n");
   }
  //打印读取的字数
  printf("test: the dev rerurn is %d !\n",dev_return_size);
  //打印读取的字符串
  printf("test: this is from dev:%s string end\n",read_txt);
  //打印读到的变量
  printf("test: this is from dev:%d  val end\n\n\n",read_txt[0]);
          usleep(100000);
//////write 写入数据到驱动空间////////

dev_write_return_size=write(ret0,write_for_dev,write_size);

//写字节个数为write_size的数据到ret0驱动程序空间,如返回数为write_size,则表示写入成功。
                      if(dev_write_return_size==write_size)
                       {printf("test: write is success!\n");}
      else printf("test:write is fail!\n");  
      printf("test:the dev write return is %d!\n\n\n",dev_write_return_size);
////// ioctl 操作/////
   usleep(100000);
   while(any<2)
   {
   scanf("%d",&any);
                     ioctl(ret0,1,any);
      }
  }
 else
  {
  printf("test: open devfail\n");
  return 0;
  }

 
 return ret0;
 }

 

  评论这张
 
阅读(153)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018