OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4027|回复: 0

测试一下写帖子:标准字符驱动

[复制链接]

2

主题

45

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4170
金钱
4170
注册时间
2013-12-27
在线时间
448 小时
发表于 2019-12-24 09:41:04 | 显示全部楼层 |阅读模式
本帖最后由 沐唐 于 2022-1-22 16:09 编辑

标准字符驱动

1、 编写内核驱动
  1. #include<linux/kernel.h>#include <linux/init.h>
  2. #include <linux/fs.h>
  3. #include <asm/io.h>
  4. #include <linux/uaccess.h>
  5. #include <linux/cdev.h>
  6. #include <linux/module.h>
  7. #include <linux/slab.h>

  8. static unsigned long *gpm4con;
  9. static unsigned long *gpm4dat;
  10. static struct cdev *pcdev;
  11. static        dev_t dev_no;

  12. <p style="text-indent: 2em;">static int  mycdev_open(structinode *inodp, struct file *filp){</p><p style="text-indent: 2em;">         printk("Hello ,This is a open !\n");</p>    //led的初始化
  13.     //申请空间 0xB8003000+0x140
  14. <p style="text-indent: 2em;">    gpm4con =ioremap(0xB8003000+0x140,8);</p>    gpm4dat = gpm4con+1;

  15.     //配置端口为输出  PF10 13 14
  16. <p style="text-indent: 2em;">    *gpm4con |=1<<10|1<<13|1<<14;</p>         return 0;
  17. }

  18. <p style="text-indent: 2em;">static ssize_t mycdev_write (struct file *filp, const char __user*buffer, size_t t, loff_t *offset){</p><p style="text-indent: 2em;">         unsigned char buf[20]={0};</p><p style="text-indent: 2em;">         copy_from_user(buf,buffer,t);</p><p style="text-indent: 2em;">         printk("Hello ,This is a write !\n");</p><p style="text-indent: 2em;">         if(!strncmp(buf,"ledon",strlen(buf))){</p><p style="text-indent: 2em;">                   *gpm4dat&= ~(1<<10|1<<13|1<<14);</p>         }
  19. <p style="text-indent: 2em;">         else if(!strncmp(buf,"ledoff",strlen(buf)))</p><p style="text-indent: 2em;">                   *gpm4dat |=1<<10|1<<13|1<<14;</p>         return 0;
  20. }

  21. <p style="text-indent: 2em;">static ssize_t mycdev_read (struct file *filp, char __user *buffer,size_t t, loff_t *offset){</p><p style="text-indent: 2em;">         printk("Hello ,This is a read !\n");</p><p style="text-indent: 2em;">         //copy_to_user(buffer,form, n);</p>         return 0;
  22. }
  23. static int mycdev_close(struct inode *inodp, struct file *filp){
  24. <p style="text-indent: 2em;">         printk("Hello ,This is a close !\n");</p>
  25.          iounmap(gpm4con);
  26.          return 0;
  27. }

  28. static struct file_operations myops={
  29.          .owner   = THIS_MODULE,
  30.          .open    = mycdev_open,
  31.          .read    = mycdev_read,
  32.          .write   = mycdev_write,
  33.          .release = mycdev_close,
  34. };

  35. static int __init mycedev_init(void){

  36.          //分配cdev空间
  37.          pcdev = cdev_alloc();
  38.          //分配设备号,次设备从0开始,分配2个
  39. <p style="text-indent: 2em;">         alloc_chrdev_region(&dev_no,0,2,"mycdev");</p>         //初始化结构体
  40.          cdev_init(pcdev,&myops);
  41.          //设备注册
  42.          cdev_add(pcdev,dev_no,2);
  43.          //直接打印主设备号,方便注册
  44. <p style="text-indent: 2em;">         //major =MAJOR(dev_no);</p><p style="text-indent: 2em;">         printk("major =%d \n", MAJOR(dev_no));</p>
  45.          return 0;
  46. }
  47. static void __exit mycedev_exit(void){
  48.          //取消设备注册
  49.          cdev_del(pcdev);
  50.          unregister_chrdev_region(dev_no,2);
  51.          kfree(pcdev);
  52. <p style="text-indent: 2em;">         printk("mycdev isexit \n");      </p>}

  53. module_init(mycedev_init);
  54. module_exit(mycedev_exit);
  55. MODULE_LICENSE("GPL");
复制代码

2编写app
#include<fcntl.h>#include <string.h>
#include <stdio.h>
#define LEDON "ledon"
#define LEDOFF "ledoff"
int main(){

         int fd =open("/dev/mycdev", O_RDWR);

         if(fd < 0){

                   printf("openleds device is failed !\r\n");

                   return -1;
         }
         while(1)
         {

                   write(fd,LEDON, strlen(LEDON)+1);

                   sleep(1);

                   write(fd,LEDOFF, strlen(LEDON)+1);

                   sleep(1);

         }

         close(fd);
                   return 0;
}
3、编写makefile
  1. <p style="text-indent: 2em;">obj-m:= mycdev.o</p>
  2.       KDIR := /tjk/tjk/nuc970bsp/linux-3.10.x
  3.    all :
  4. <p style="text-indent: 2em;">         make -C $(KDIR)M=$(PWD) modules</p><p style="text-indent: 2em;">         rm -rf *.cmd *.o*.symvers *.order *.mod.* *.unsigned</p>     app :
  5. <p style="text-indent: 2em;">         arm-linux-gcc ledapp.c-o ledapp</p>
复制代码

注意:1、  MAJOR(dev_no)返回主设备号
2、  Mknod /dev/mycdev c 253 0 创建设备文件
Cat /proc/devices   查看主设备号






正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 03:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表