zoukankan      html  css  js  c++  java
  • 字符驱动之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!
    ");
    
      if(argc != 2)
    
        printf("two parameter
    ");
    
      write(xxx);
    
     }
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
  • 相关阅读:
    转载-MongoDB 分片集群技术
    EXT4参数优化及测试---转载
    9.16周记
    PHP优化思路
    2018.09.10-拾遗
    周记8
    落地成盒-发快递
    周记7
    GTX log 6
    Gitlab Jenkins WebHook 持续集成配置踩坑记
  • 原文地址:https://www.cnblogs.com/stm32f4/p/8330937.html
Copyright © 2011-2022 走看看