硬件_LED

LED


平台:全志A64

源码:Android 7.1  Linux 3.1

 

led.c

  1 //没有使用平台总线
  2 
  3 #include <linux/init.h>
  4 #include <linux/module.h>
  5 #include <linux/fs.h>
  6 #include <linux/device.h>
  7 #include <linux/slab.h>
  8 #include <linux/gpio.h>
  9 #include <linux/cdev.h>
 10 
 11 #include <asm/io.h>
 12 #include <asm/uaccess.h>
 13 #include <asm-generic/ioctl.h>
 14 
 15 
 16 //面向对象封装led信息
 17 struct a64_led{
 18     //unsigned int major;
 19     dev_t  devno;
 20     struct class * cls;
 21     struct device * dev;
 22     struct cdev  *cdev;
 23     int data;
 24 };
 25 struct a64_led *led_dev;
 26 
 27 
 28 volatile unsigned int *gpco_conf = NULL;
 29 volatile unsigned int *gpco_data = NULL;
 30 
 31 
 32 
 33 
 34 int led_open(struct inode *inode, struct file *filp)
 35 {
 36 
 37     //将对应的管脚设置为输出——PL10
 38     *gpco_conf &= ~(0x07<<8);  //清零    
 39     *gpco_conf |=   0x01<<8;   //置位
 40    
 41     return 0;
 42 }
 43 
 44 
 45 ssize_t led_write(struct file *filp, const char __user *buf, size_t size, loff_t *flags)
 46 {
 47     int ret;
 48 
 49     //应用空间数据转换为内核空间数据
 50     ret = copy_from_user(&led_dev->data,buf,size);
 51     if(ret != 0){
 52         printk("copy_from_user error!\n");
 53         return -EFAULT;
 54     }
 55 
 56     if(led_dev->data){
 57         *gpco_data |= 0x1<<10; //点灯
 58     }else{
 59         *gpco_data &= ~(0x1<<10);//灭灯    
 60     }
 61 
 62     return size;
 63 }
 64 
 65 
 66 int led_close(struct inode *inode, struct file *filp)
 67 {
 68     
 69     *gpco_data &= ~(0x1<<10);  //灭灯
 70     
 71     return 0;
 72 }
 73 
 74 
 75 static struct file_operations fops = {
 76     .open = led_open,   // 打开对gpio初始化config
 77     .write = led_write,
 78     .release = led_close,
 79 };
 80 
 81 
 82 static int __init led_init(void)   
 83 {
 84 
 85 // 1_实例化设备对象
 86     //参数1 -- 要申请的空间的大小
 87     //参数2 -- 申请的空间的标识    
 88     led_dev = kzalloc(sizeof(struct a64_led),GFP_KERNEL);
 89     if(IS_ERR(led_dev)){
 90         printk("kzalloc error!\n");
 91         ret = PTR_ERR(led_dev);
 92         return -ENOMEM;
 93     }
 94 
 95 
 96 // 2_申请设备编号
 97 
 98     //动态申请设备号
 99     ret = alloc_chrdev_region(&led_dev->devno,10,1,"led_drv");
100     if(ret < 0){
101         printk("register_chrdev_region error!\n");
102         ret =  -EINVAL;
103         goto err_kfree;
104     }
105 
106     //申请cdev的空间
107     led_dev->cdev = cdev_alloc();
108     if(IS_ERR(led_dev->cdev)){        
109         printk("led_dev->cdev error!\n");
110         ret = PTR_ERR(led_dev->cdev);
111         goto err_unregister;
112     }
113 
114     //初始化cdev的成员
115     cdev_init(led_dev->cdev,&fops);
116     
117     //将cdev加入到内核中----链表
118     ret = cdev_add(led_dev->cdev,led_dev->devno,1);
119     
120     
121 // 3_创建设备文件    
122     led_dev->cls = class_create(THIS_MODULE,"led_cls");
123     if(IS_ERR(led_dev->cls)){
124         printk("class_create error!\n");
125         ret = PTR_ERR(led_dev->cls);
126         goto err_cdev_del;
127     }    
128     led_dev->dev = device_create(led_dev->cls,NULL,led_dev->devno,NULL,"led");
129     if(IS_ERR(led_dev->dev)){
130         printk("device_create error!\n");
131         ret = PTR_ERR(led_dev->dev);
132         goto err_class;
133     }    
134 
135 // 4_硬件初始化----地址映射
136 
137     gpco_conf = ioremap(0x1F02C04,8);
138     gpco_data = ioremap(0x1F02C10,8);    
139 
140     return 0;
141 
142 err_class:
143     class_destroy(led_dev->cls);
144     
145 err_cdev_del:
146     cdev_del(led_dev->cdev);
147     
148 err_unregister:
149     unregister_chrdev_region(led_dev->devno,1);
150     
151 err_kfree:
152     kfree(led_dev);
153     return ret;
154 
155 }
156 
157 
158 static void __exit led_exit(void)   
159 {
160     printk("--------^_^ %s------------\n",__FUNCTION__);
161     device_destroy(led_dev->cls,led_dev->devno);
162     class_destroy(led_dev->cls);
163     cdev_del(led_dev->cdev);
164     unregister_chrdev_region(led_dev->devno,1);
165     kfree(led_dev);
166 }
167 
168 module_init(led_init);
169 module_exit(led_exit);
170 MODULE_LICENSE("GPL");

 

 

app.c

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <unistd.h>
 4 #include <sys/types.h>
 5 #include <sys/stat.h>
 6 #include <fcntl.h>
 7 #include <sys/ioctl.h>
 8 
 9 
10 int main(void)
11 {
12     char led [1] = {1};
13     
14     int fd = open("/dev/led",O_RDWR);
15     if(fd < 0){
16     perror("open");
17     exit(1);
18     }
19 
20     //闪灯
21     int ret = write(fd, led, 1);
22     if(ret <0)
23     {
24         printf("write failed !\n");
25         exit(0);
26     }
27     sleep(1);
28     
29     close(fd);
30     return 0;
31 }

 

 

笔记


  配置寄存器和数据寄存器自行查询用户手册(基地址+偏移地址)

  A64:如下

  

 

 

   

 

转载于:https://www.cnblogs.com/panda-w/p/11313208.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/549800.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

水星路由器DNS服务器未响应,水星路由器进不去设置怎么办

摘 要水星路由器进不去设置怎么办&#xff1f;这里要分两种情况&#xff0c;旧版水星路由器与新版水星路由器一、旧版水星路由器 1、当打开水星路由器设置页面&#xff0c;如果提示你输入用户名和密码&#xff0c;如下图所示。说明这是一台旧版本的水星路由器水星路由器进不去设…

zookeeper 简介

什么是ZookeeperZookeeper是一个分布式开源框架&#xff0c;提供了协调分布式应用的基本服务&#xff0c;它向外部应用暴露一组通用服务——分布式同步&#xff08;Distributed Synchronization&#xff09;、命名服务&#xff08;Naming Service&#xff09;、集群维护&#x…

小程序的服务器怎么与数据库连接,小程序怎么连接服务器数据库

小程序怎么连接服务器数据库 内容精选换一换“数据导出”章节适用于MRS 3.x及后续版本。Loader是实现MRS与关系型数据库、文件系统之间交换数据和文件的ETL工具&#xff0c;支持将数据或者文件从MRS系统中导出到关系型数据库或文件系统中。Loader支持如下数据导出方式&#xff…

啪啪三国2获取服务器信息,啪啪三国2怎么快速的获得资源?

啪啪三国2&#xff1a;在啪啪三国2手游中有很多特色的玩法&#xff0c;还有很多资源&#xff0c;游戏中有很多地方需要用到&#xff0c;有点供不应求的感觉&#xff0c;很多玩加都想要快速的获得各种资源。小伙伴们知道该怎么快速获得吗&#xff1f;这里小编就给大家来详细的介…

C#常用的文件操作 (转)

C#常用的文件操作 C#常用的文件操作&#xff08;网上收集&#xff09; C#写入/读出文本文件&#xff0c;包括创建文件&#xff0c;追加文件&#xff0c;修改文件&#xff0c;等等操作&#xff0c;个人觉得很适用&#xff0c;所以收藏了&#xff0c;和大家分享 publicvoidPage…

CSS3动画和VUE动画整理

W3School CSS3过渡 浏览器支持 Internet Explorer 10、Firefox、Chrome 以及 Opera 支持 transition 属性。Safari 需要前缀 -webkit-。 注释&#xff1a;Internet Explorer 9 以及更早的版本&#xff0c;不支持 transition 属性。 注释&#xff1a;Chrome 25 以及更早的版本…

VueJS项目

VueJS项目 - awesome-vue vue-cli引用jquery, bootstrap, bootstrap-table 引用jquery 找到vue-project/build/webpack.base.conf.js文件&#xff0c;在module.exports下添加plugins, 需要在之前&#xff0c;引用webpack, var webpack require(webpack); 参考 plugins: [n…

[OSG]如何用Shader得到物体的世界坐标

最近群里面有个朋友问我关于如何得到OpenGL世界坐标的问题&#xff0c;当时我还弄错了&#xff0c;误以为gl_ModelViewMatrix*gl_Vertex就是世界坐标。因最近也突然遇到了世界坐标的问题&#xff0c;所以花了一些时间来研究这个问题&#xff0c;网上也有人问&#xff0c;但或许…

Exposing Windows Forms Controls as ActiveX controls

转&#xff1a;http://www.codeproject.com/cs/miscctrl/exposingdotnetcontrols.asp?df100&forumid2373&exp0&select1359005 Download demo project - 15 Kb This article will describe how to utilise Windows Forms controls outside of .NET. In a recent MS…

QT_C++

QT_C C 与 C 区别&#xff1a;  面向过程&#xff1a;吃&#xff08;狗&#xff0c;屎&#xff09; 面向对象&#xff1a;狗. 吃&#xff08;屎&#xff09; ^ . ^ 博客&#xff1a;https://www.runoob.com/cplusplus/cpp-tutorial.html 插入符&#xff1a;<< 控制符…

静态路由的实现

在路由器A上做如下配置&#xff1a;router(config)#hostname AA(config)#interface f0/0A(config-if)#ip address 192.168.1.1 255.255.255.0 A(config-if)#no shutdownA(config)#interface f0/1A(config-if)#ip address 192.168.2.1 255.255.255.0 A(config-if)#no shutdownA(…

2019-08-09 纪中NOIP模拟赛B组

T1 [JZOJ1035] 粉刷匠 题目描述 windy有N条木板需要被粉刷。 每条木板被分为M个格子。 每个格子要被刷成红色或蓝色。 windy每次粉刷&#xff0c;只能选择一条木板上一段连续的格子&#xff0c;然后涂上一种颜色。 每个格子最多只能被粉刷一次。 如果windy只能粉刷 T 次&#x…

vue3实现打字机的效果

前言&#xff1a; vue3项目中实现打字机的效果。 实现效果&#xff1a; 实现步骤&#xff1a; 1、安装插件 npm i vue3typed 2、main.js中配置 import vuetyped from vue3typedconst app createApp(App) // 挂载打字机的全局方法 app.use(vuetyped) 3、界面使用 <vuet…

hightopo学习系列:hightopo介绍(一)

起因 新的软件主管来公司以后&#xff0c;有整整2周的时间没有搭理前端开发。就在这周一快下班的时候&#xff0c;突然和我说话了。问了我一些以前用的图形库&#xff0c;并让我开始了解hightopo。甩给了我一个全拼&#xff0c;就拂袖而去&#xff0c;留下一脸懵逼的我。 没办…

Unity工程无代码化

目的 Unity默认是将代码放入工程&#xff0c;这样容易带来一些问题。1. 代码和资源混合&#xff0c;职能之间容易互相误改。2. 当代码量膨胀到一定程度后&#xff0c;代码的编译时间长到无法忍受。新版的unity支持通过asmdef来将代码分成多个dll工程&#xff0c;有所缓解。所以…

曾国藩传 读后感

转载于:https://www.cnblogs.com/eat-too-much/p/11335113.html

深入C#学习系列一:序列化(Serialize)、反序列化(Deserialize)

深入C#学习系列一&#xff1a;序列化(Serialize)、反序列化(Deserialize) 序列化又称串行化&#xff0c;是.NET运行时环境用来支持用户定义类型的流化的机制。其目的是以某种存储形成使自定义对象持久化&#xff0c;或者将这种对象从一个地方传输到另一个地方。.NET框架提供了两…

十一月·飘·立冬

十一月的南粤叶依然青翠在枝头与秋风和舞落叶遍地的诗意画面在博客生活逝如流年 渐走渐淡回忆飘然而来又飘然而去秋的最后一天放下回忆 飘去天涯飘不要说也不要问目光交错的一瞬注定了今生缘分此情可以见真心春风急 秋风也狠乱乱纷纷 是红尘浮浮沉沉 似幻似真金枝玉叶的结…

Centos 系统安装NetCore SDK命令以及一系列操作(1)

17年买的jesse老师的课程&#xff0c;虽然说NetCore出来很久了&#xff0c;自己打入行的时候就奔它去的&#xff0c;但。。。。废话不说了&#xff0c;还是自己做了再说吧&#xff0c; 首先需要一个Centos系统来让我们开始玩&#xff0c;下载地址&#xff1a;https://www.cento…

如何高效地判断奇数和偶数

在我们日常的编程当中&#xff0c;常常会遇到判断某个整数属于奇数还是偶数的情况。 大家一般的处理做法是用这个整数和2取模。然后判断是等于1还是等于0。 这里&#xff0c;我要为大家介绍一种快速有效的判断做法&#xff0c;利用2进制进行判断。 大家都知道&#xff0c;奇数的…