• 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
    ");
    	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
    ");
    	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 !
    ");
    		exit(1);
    	}
    	else
    	{
    		printf("open success ! 
    ");
    	}
    	
    	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




  • 相关阅读:
    5.2 spring5源码--spring AOP源码分析三---切面源码分析
    5.2 spring5源码--spring AOP源码分析二--切面的配置方式
    在Dubbo中使用Zookeeper入门案例
    Dubbo直连方式改造
    Dubbo直连方式
    16.3.3 对矢量可执行的其它操作
    16.3.2 可对矢量(vector)执行的操作
    16.3 标准模板库
    16.2.2 有关智能指针的注意事项
    16.2.1 使用智能指针
  • 原文地址:https://www.cnblogs.com/yxwkf/p/3856454.html
Copyright © 2020-2023  润新知