字符驱动之LED(二:实现点灯功能)

1.首先在驱动文件开头定义用于保存带操作IOK口的unsigned long变量,并且要用volatile修饰。

  volatile unsigned long *gpfcon = NULL;
  volatile unsigned long *gpfdat = NULL;

 

2.在入口函数中对寄存器进行映射。

   gpfcon = (volatile unsigned long *)ioremap(0x56000050, 16);

//该函数的第一个参数为物理起始地址,第二个参数位长度。

  gpfdat = gpfcon + 1;

 

3.在入口函数中建立了映射,就要在出口函数中取消映射。

  iounremap(gpfcon);

 

4.要在open函数中配置引脚。

 *gpfcon &= ~((0x3<<(4*2)) | (0x3<<(5*2)) | (0x3<<(6*2)));
 *gpfcon |= ((0x1<<(4*2)) | (0x1<<(5*2)) | (0x1<<(6*2)));
 return 0;

 

5.怎样根据应用程序的参数来控制外设(LED)?

  write(fd,&val,4);

  第一个参数是打开的文件,fd = open("xxx");

  第二个参数是&val相当于驱动write函数的buff。

  第三个参数是长度。

 write函数格式定义如下:

static ssize_t first_drv_write(struct file *file,const char __user *buf,size_t count,loff_t *ppos)

{

  copy_from_user(&val,buf,count);

  通过copy_from_user这个函数将用户空间的数据拷贝到内核空间中。

  copy_to_user(&val,buf,count);

  将内核空间的数据拷贝到用户空间。

  然后对val的值进行判断

  if(val == 1)

  {

    //点灯

  }

  else

  {

    //熄灯

  }

}

 

 测试程序如下:

int main(int argc,char **argv)

{

   int fd;

  int val = 1;

  fd = open("/dev/xyz",O_RDWR);

   if(fd < 0)

    printf("file can't open!\n");

  if(argc != 2)

    printf("two parameter\n");

  write(xxx);

 }

 

 

 

 

 

 

 

 

 

posted @ 2018-01-22 20:17  梦提三尺剑  阅读(262)  评论(0编辑  收藏  举报