硬件_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,一经查实,立即删除!

相关文章

思科考试报名流程

有考生经常来信来电咨询&#xff0c;关于认证注册和考试报名流程的相关内容&#xff0c;针对这点中国思科注册网就为大家整理了以下详细的解释。 1、报名地点及联系方式&#xff1a;思科考试报名地点&#xff1a;a.选择您所在城市报名点报名&#xff1b;b.选择中国思科注册网报…

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

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

DotNet程序员是不是最不幸福?

自我学C#和ASp.net时就来逛DotNet区&#xff0c;总是时不时有人问“学.net是不是没有前途&#xff1f;”&#xff0c;总是有人“报怨.net程序人收入比某某要低”。还有人说“在中国&#xff0c;程序人干不到老。”我也曾心动过&#xff0c;想过放弃。 但是&#xff0c;冷静下来…

zookeeper 简介

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

discuz的ajax,discuz分页函数改成基于jqueryd的ajax分页函数

/***AJAX分页*$num 为总共的条数 比如说这个分类下共有15篇文章*$perpage为每页要显示的条数*$curpage为当前的页数*$url为请求路径&#xff0c;*$obj为html对象&#xff0c;返回给jqery处理*$page为$multipage这个字符串中要显示的表示页数的变量个数*$maxpages为最大的页数…

北大青鸟:比尔盖茨:我在微软的10大失误

北大青鸟&#xff1a;比尔盖茨&#xff1a;我在微软的10大失误来源&#xff1a;[url]http://www.accp-teem.com.cn/ArticleView/2007-7-11/Article_View_1172.Htm[/url] 微软上周四宣布&#xff0c;从2008年7月开始&#xff0c;董事会主席比尔盖茨将不再负责公司的日常管理&…

网格 优化光顺

简介 网格光滑在计算机图形学中广泛应用。因为从自然界采集的雕像带有很多的噪声。本文对 论文 Laplacian Mesh Optimization 当然错误难以避免&#xff0c;本人水平不足造成错误&#xff0c;希望读者能给予我及时的反馈&#xff0c;本人感激不尽 使用简介 Laplacian Mesh Opti…

2进制、8进制、10进制、16进制...各种进制间的轻松转换(c#)

在.NET Framework中&#xff0c;System.Convert类中提供了较为全面的各种类型、数值之间的转换功能。其中的两个方法可以轻松的实现各种进制的数值间的转换&#xff1a; Convert.ToInt32(string value, int fromBase)&#xff1a; 可以把不同进制数值的字符串转换为数字&#x…

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

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

iPad软件提交注意事项

这是CocoaChina会员 "stlau"根据自己的iPad软件提交经验总结的注意事项&#xff0c;希望大家留意一下&#xff0c;避免软件被苹果审核人员拒绝放行。帖 子地址 http://www.cocoachina.com/bbs/read.php?tid-17119.html肯 定会被拒的情况&#xff1a;1. app命名&…

SQL Assistant v2.5.12 序列号

715253-4G50IRL-1L44-5055 715253-4G50IRL-SL44-5055 715253-4G50IRL-EL44-5055转载于:https://www.cnblogs.com/hzuIT/articles/830208.html

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

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

git上传文件过大如何删除

参考链接 https://my.oschina.net/jfinal/blog/215624?fromerrZTZ6c38X 转载于:https://www.cnblogs.com/eat-too-much/p/11318085.html

向Window窗体发送消息,控制程序的运行.

下面是对Windows Media Player进行控制的操作示例.1.运行Windows Media Player;2.运行spyxx.exe,点击"日志消息"图标,在弹出的"消息选项" 窗体中,将"查找程序 工具"图标拖至 Windows Media Player 窗体上;3.点击" 消息"选项卡,选取W…

更新MySQL复制 自动监控脚本

具体代码请见&#xff1a; MySQL复制 自动监控脚本增加了判断slave落后于master多少秒的机制。本文出自 “MySQL中文网”博客 http://www.imysql.cn/转载于:https://blog.51cto.com/imysql/308256

网格参数化和网格的形变,同实验室的人实现。

简介 网格参数化和网格的形变&#xff0c;同实验室的人实现。 参考链接 gitee 转载于:https://www.cnblogs.com/eat-too-much/p/11319920.html

Prototype1.5.1源代码解读分析-3

< DOCTYPE html PUBLIC -WCDTD XHTML StrictEN httpwwwworgTRxhtmlDTDxhtml-strictdtd> BrowserFeatures BrowserFeatures&#xff08;浏览器特征&#xff09;的值也是一个对象。内容如下&#xff1a; { XPath: !!document.evaluate, ElementExtensions: !!window.HTMLEl…

OCP-052考试题库汇总(24)-CUUG内部解答版

Which structure can span multiple data files? A)a bigfile tablespace B)a permanent tablespace C)a segment D)a temporary tablespace E)an extent Answer: C 转载于:https://www.cnblogs.com/cnblogs5359/p/11320250.html

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

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

纪中七日游——腐败篇

题目神马的等我把其余的题调完再放吧 DAY -N 我&#xff1a;“完蛋了QAQ&#xff0c;我们要去广东&#xff0c;&#xff0c;&#xff0c;有蟑螂怎么办” 生竞生A&#xff1a;”听说那里的蟑螂硼酸杀不死&#xff0c;会飞还很大&#xff0c;&#xff0c;&#xff0c;你加油&…