DM8168 GPIO驱动与測试程序

DM8168 GPIO驱动与測试程序

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

本次測试针对GPIO1进行,挑选了GP1[31],引脚的复用默认的就是GPIO

还是老规矩,贴上driver.c,Makefile,test.c:

dm8168_gpio.c:

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/uaccess.h> /* copy_to_user,copy_from_user */
#include <linux/miscdevice.h>
#include <linux/device.h>
#include <asm/io.h>

static struct class  *gpio_class;

volatile unsigned long *DIR;
volatile unsigned long *DAT;

int gpio_open (struct inode *inode,struct file *filp)

{
	*DIR = 0x0;  //output
	return 0;
}

ssize_t gpio_read (struct file *filp, char __user *buf, size_t count,loff_t *f_pos)
{
	return 0;
}

ssize_t gpio_write (struct file *filp, const char __user *buf, size_t count,loff_t *f_pos)
{
	char val_buf[2];
	int ret;
	ret = copy_from_user(val_buf,buf,count);
		
	switch(val_buf[0])
	{
		case 0x31 :
			*DAT = 0xf0000000;  //gp1[31]
			break;
		case 0x30 :
			*DAT = 0x0;         //gp1[31]
			break;
		default :
			break;
	}
	return count;
}

struct file_operations gpio_fops =
{
	.owner   = THIS_MODULE,
	.open    = gpio_open,
	.read    = gpio_read,
	.write   = gpio_write,
} ;

int major;
int gpio_init (void)
{ 	
	
	major = register_chrdev(0,"DM8168_gpio",&gpio_fops);
	gpio_class = class_create(THIS_MODULE, "DM8168_gpio");
	device_create(gpio_class,NULL,MKDEV(major,0),NULL,"gpio");

	DIR = (volatile unsigned long *)ioremap(0x4804C134,4);
	DAT = (volatile unsigned long *)ioremap(0x4804C13C,4);

	printk ("gpio is ready\n");
	return 0;
}

void gpio_exit (void)
{
	unregister_chrdev(major,"DM8168_gpio");
	device_destroy(gpio_class,MKDEV(major,0));
	class_destroy(gpio_class);

	iounmap(DIR);
	iounmap(DAT);

	printk ("module exit\n");
	return ;
}

MODULE_LICENSE("GPL");
module_init(gpio_init);
module_exit(gpio_exit);

Makefile:

obj-m:= dm8168_gpio.o

CROSSCOMPILE := /opt/codesourcery/arm-2009q1/bin/arm-none-linux-gnueabi-

CC  := $(CROSSCOMPILE)gcc 

KDIR:=/home/***/ti-ezsdk_dm816x-evm_5_03_01_15/board-support/linux-2.6.37-psp04.00.01.13.patch2

PWD :=$(shell pwd)

default:
	$(MAKE) -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
clean:
	rm -rf *.ko *.o .*cmd *.mod.c .tmp_versions 

gpio_test:

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>

int main(int argc, char *argv[])
{
	int  fd;
	int  val=0;

	fd=open("/dev/gpio",O_RDWR);

	if(fd<0)
	{
		printf("open device failed !\n");
		exit(1);
	}
	else
	{
		printf("open success ! \n");
	}
	
	write(fd,argv[1],1);
	
	close(fd);
	return 0;
}


測试 :

模块编译后载入:insmod dm8168_gpio.ko

交叉编译測试程序:arm-none-linux-gnueabi-gcc -o gpio_test gpio_test.c

执行:./gpio_test 1

GP1[31]为3.3V

执行:./gpio_test 0

GP1[31]为0V

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/118926.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ~按位取反_按位取反什么意思

    ~按位取反_按位取反什么意思inta=0;intb=~a;System.out.println(b);  // -1计算方法:因为整形是32位有符号补码整数表示的。因此将整形转换为二进制后为:a 十进制0二进制00000000000000000000000000000000~a的二进制1111111111111111111111111

    2022年8月15日
    11
  • idea查询激活码(注册激活)

    (idea查询激活码)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~0UY7…

    2022年3月28日
    108
  • Spring Cloud与Dubbo的完美融合之手「Spring Cloud Alibaba」[通俗易懂]

    Spring Cloud与Dubbo的完美融合之手「Spring Cloud Alibaba」[通俗易懂]很早以前,在刚开始搞SpringCloud基础教程的时候,写过这样一篇文章:《微服务架构的基础框架选择:SpringCloud还是Dubbo?》,可能不少读者也都看过。之后也就一直有关于这两个框架怎么选的问题出来,其实文中我有明确的提过,SpringCloud与Dubbo的比较本身是不公平的,主要前者是一套较为完整的架构方案,而Dubbo只是服务治理与RPC实现方案。由于Dubbo在…

    2022年5月27日
    42
  • bool型函数「建议收藏」

    bool型函数「建议收藏」bool介绍C++中bool函数如果值非零就为True,为零就是False。比如写数据结构的时候,有时候需要判断一下链表是不是为空,这时候需要用到bool函数,再者,你看到bool就知道这个函数返回值只是用于判断真假。bool函数返回的只有true和false。而int会返回各种数字,但是你关心的不是数字的多少,而是这个数字为不为0.所以这种情况用bool会更加简洁,规范,你看到bo…

    2022年6月5日
    33
  • 【转载】究竟啥才是互联网架构“高并发”

    【转载】究竟啥才是互联网架构“高并发”

    2021年11月20日
    47
  • 【《重构 改善既有代码的设计》学习笔记5】重构列表

    本篇文章的内容来自《重构 改善既有代码的设计》一书学习笔记整理并且加上自己的浅显的思考总结!重构列表,为重构提供一个坚实的起点,支持后面的重构工作!1、重构的记录格式书中说:每个重构手法都有如下五个部分。名称(name),建造一个重构词汇表,名称是很重要的。简单的概要(summary),介绍此重构手法的使用情景,以及它做的事情。动机(motivation),为什么需要这…

    2022年2月27日
    45

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号