#include <linux/module.h>
#include <linux/fs.h>
#include <linux/io.h>
#include <linux/errno.h>
#include <linux/miscdevice.h>
#include <linux/kernel.h>
#include <linux/major.h>
#include <linux/mutex.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
#include <linux/stat.h>
#include <linux/init.h>
#include <linux/device.h>
#include <linux/tty.h>
#include <linux/kmod.h>
#include <linux/gfp.h>
#include "led_opr.h"
struct iomux {
volatile unsigned int unnames[23];
volatile unsigned int IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO00; /* offset 0x5c*/
volatile unsigned int IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO01;
volatile unsigned int IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO02;
volatile unsigned int IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03;
volatile unsigned int IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO04;
volatile unsigned int IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO05;
volatile unsigned int IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO06;
volatile unsigned int IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO07;
volatile unsigned int IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO08;
volatile unsigned int IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO09;
};
struct imx6ull_gpio {
volatile unsigned int dr;
volatile unsigned int gdir;
volatile unsigned int psr;
volatile unsigned int icr1;
volatile unsigned int icr2;
volatile unsigned int imr;
volatile unsigned int isr;
volatile unsigned int edge_sel;
};
/* enable GPIO1,GPIO5 */
static volatile unsigned int *CCM_CCGR1;
/* set GPIO5_IO03 as GPIO */
static volatile unsigned int *IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER3;
static struct iomux *iomux;
static struct imx6ull_gpio *gpio1;
static struct imx6ull_gpio *gpio5;
static int board_demo_led_init (int which) /* 初始化LED, which-哪个LED */
{
if (!CCM_CCGR1)
{
CCM_CCGR1 = ioremap(0x20C406C, 4);
IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER3 = ioremap(0x2290014, 4);
iomux = ioremap(0x20e0000, sizeof(struct iomux));
gpio1 = ioremap(0x209C000, sizeof(struct imx6ull_gpio));
gpio5 = ioremap(0x20AC000, sizeof(struct imx6ull_gpio));
}
if (which == 0)
{
/* 1. enable GPIO5
* CG15, b[31:30] = 0b11
*/
*CCM_CCGR1 |= (3<<30);
/* 2. set GPIO5_IO03 as GPIO
* MUX_MODE, b[3:0] = 0b101
*/
*IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER3 = 5;
/* 3. set GPIO5_IO03 as output
* GPIO5 GDIR, b[3] = 0b1
*/
gpio5->gdir |= (1<<3);
}
else if(which == 1)
{
/* 1. enable GPIO1
* CG13, b[27:26] = 0b11
*/
*CCM_CCGR1 |= (3<<26);
/* 2. set GPIO1_IO03 as GPIO
* MUX_MODE, b[3:0] = 0b101
*/
iomux->IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 = 5;
/* 3. set GPIO1_IO03 as output
* GPIO1 GDIR, b[3] = 0b1
*/
gpio1->gdir |= (1<<3);
}
else if(which == 2)
{
/* 1. enable GPIO1
* CG13, b[27:26] = 0b11
*/
*CCM_CCGR1 |= (3<<26);
/* 2. set GPIO1_IO05 as GPIO
* MUX_MODE, b[3:0] = 0b101
*/
iomux->IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO05 = 5;
/* 3. set GPIO1_IO05 as output
* GPIO1 GDIR, b[5] = 0b1
*/
gpio1->gdir |= (1<<5);
}
else if(which == 3)
{
/* 1. enable GPIO1
* CG13, b[27:26] = 0b11
*/
*CCM_CCGR1 |= (3<<26);
/* 2. set GPIO1_IO06 as GPIO
* MUX_MODE, b[3:0] = 0b101
*/
iomux->IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO06 = 5;
/* 3. set GPIO1_IO06 as output
* GPIO1 GDIR, b[6] = 0b1
*/
gpio1->gdir |= (1<<6);
}
//printk("%s %s line %d, led %d\n", __FILE__, __FUNCTION__, __LINE__, which);
return 0;
}
static int board_demo_led_ctl (int which, char status) /* 控制LED, which-哪个LED, status:1-亮,0-灭 */
{
//printk("%s %s line %d, led %d, %s\n", __FILE__, __FUNCTION__, __LINE__, which, status ? "on" : "off");
if (which == 0)
{
if (status) /* on : output 0 */
gpio5->dr &= ~(1<<3);
else /* on : output 1 */
gpio5->dr |= (1<<3);
}
else if (which == 1)
{
if (status) /* on : output 0 */
gpio1->dr &= ~(1<<3);
else /* on : output 1 */
gpio1->dr |= (1<<3);
}
else if (which == 2)
{
if (status) /* on : output 0 */
gpio1->dr &= ~(1<<5);
else /* on : output 1 */
gpio1->dr |= (1<<5);
}
else if (which == 3)
{
if (status) /* on : output 0 */
gpio1->dr &= ~(1<<6);
else /* on : output 1 */
gpio1->dr |= (1<<6);
}
return 0;
}
static struct led_operations board_demo_led_opr = {
.num = 4,
.init = board_demo_led_init,
.ctl = board_demo_led_ctl,
};
struct led_operations *get_board_led_opr(void)
{
return &board_demo_led_opr;
}
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
在Linux中,应用程序(App)和驱动程序(Driver)是两个不同的概念和角色。 应用程序是运行在操作系统上的用户级程序,通过操作系统提供的API(应用程序接口)来实现特定的功能。应用程序可以包括各种类型的软件,如图形界面应用、命令行工具、网络应用、数据库应用等。应用程序通常是由开发人员编写的,使用高级编程语言(如C、C++、Python等)编写,并使用操作系统提供的库函数和工具。 驱动程序是一种特殊的软件,用于与硬件设备进行交互和控制。驱动程序负责将应用程序的请求传递给硬件设备,并将硬件设备的响应返回给应用程序。驱动程序通常在操作系统内核空间中运行,因此具有更高的权限和更直接的访问硬件的能力。驱动程序可以是内核自带的,也可以是外部开发人员编写的。 Linux是一个开放源代码的操作系统,因此许多应用程序和驱动程序都是由社区开发人员贡献的。Linux的应用程序和驱动程序生态系统非常丰富,支持各种硬件设备和应用场景。 对于开发应用程序,开发人员通常使用标准的编程语言和工具,如C、C++、Python、Java等,并使用Linux操作系统提供的API和库函数来编写应用程序。
资源推荐
资源详情
资源评论
收起资源包目录
Linux下的IMX6ULL-开发板的第一个APP和驱动实验(三) (132个子文件)
board_100ask_imx6ull-qemu.c 5KB
board_100ask_imx6ull-qemu.c 5KB
chip_demo_gpio.c 4KB
chip_demo_gpio.c 4KB
leddrv.c 4KB
leddrv.c 4KB
leddrv.c 3KB
leddrv.c 3KB
leddrv.c 3KB
leddrv.c 3KB
leddrv.c 3KB
leddrv.c 3KB
leddrv.c 3KB
leddrv.c 3KB
leddrv.c 3KB
leddrv.c 3KB
leddrv.c 3KB
board_am335x.c 3KB
hello_drv.c 3KB
board_100ask_imx6ull.c 3KB
board_fire_imx6ull-pro.c 3KB
board_atk_imx6ull-alpha.c 3KB
hello_drv.c 3KB
board_rk3399.c 3KB
chip_demo_gpio.c 3KB
board_am335x.c 3KB
board_am335x.c 3KB
board_am335x.c 3KB
board_am335x.c 3KB
board_am335x.c 3KB
board_fire_imx6ull-pro.c 3KB
board_fire_imx6ull-pro.c 3KB
board_atk_imx6ull-alpha.c 3KB
board_atk_imx6ull-alpha.c 3KB
board_rk3399.c 3KB
board_rk3399.c 3KB
board_rk3399.c 3KB
board_rk3399.c 3KB
board_rk3288.c 3KB
board_rk3288.c 3KB
board_rk3288.c 3KB
board_rk3288.c 3KB
board_rk3288.c 3KB
led_drv.c 3KB
led_drv.c 2KB
board_100ask_stm32mp157.c 2KB
chip_demo_gpio.c 2KB
led_drv.c 1KB
board_A_led.c 1KB
100ask_led.mod.c 1KB
100ask_led.mod.c 1KB
board_A_led.c 1KB
board_demo.c 1KB
board_demo.c 1KB
board_demo.c 1KB
board_demo.c 1KB
board_demo.c 1KB
board_demo.c 1KB
board_demo.c 1KB
board_demo.c 1KB
board_demo.c 1KB
hello_drv_test.c 891B
hello_drv_test.c 891B
board_A_led.c 733B
ledtest.c 731B
ledtest.c 731B
ledtest.c 731B
ledtest.c 731B
ledtest.c 731B
ledtest.c 731B
ledtest.c 731B
ledtest.c 731B
ledtest.c 731B
ledtest.c 731B
ledtest.c 731B
ledtest.c 731B
ledtest.c 731B
ledtest.c 674B
ledtest.c 674B
ledtest.c 674B
hello.c 276B
board_A_led.c 183B
100ask_led.dts 219B
led_resource.h 317B
led_resource.h 317B
led_opr.h 309B
led_opr.h 309B
led_opr.h 309B
led_opr.h 309B
led_opr.h 309B
led_opr.h 309B
led_opr.h 309B
led_opr.h 309B
led_opr.h 309B
led_opr.h 301B
led_opr.h 301B
led_opr.h 301B
led_opr.h 298B
leddrv.h 238B
led_resource.h 232B
共 132 条
- 1
- 2
资源评论
妄北y
- 粉丝: 1w+
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于MIC+NE555光敏电阻的声光控电路Multisim仿真原理图
- python tkinter-08-盒子模型.ev4.rar
- Doozy UI Manager 2023
- 基于matlab实现夜间车牌识别程序(1).rar
- 基于matlab实现无线传感器网络无需测距定位算法matlab源代码 包括apit,dv-hop,amorphous在内的共7个
- 基于python的yolov5实现的旋转目标检测
- 基于matlab实现无线传感器网络 CAB定位仿真程序 这是无线传感器节点定位CAB算法的仿真程序,由matlab完成.rar
- 基于matlab实现图像处理,本程序使用背景差分法对来往车辆进行检测和跟踪.rar
- 基于matlab实现视频监控中车型识别代码,自己写的,希望和大家多多交流.rar
- springcodespringcodespringcodespringcode
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功