DM8168 GPIO驱动与测试程序

来源:互联网 发布:虚拟社交网络利大于弊 编辑:程序博客网 时间:2024/05/17 21:52

本次测试针对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;  //outputreturn 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.oCROSSCOMPILE := /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.patch2PWD :=$(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

5 0
原创粉丝点击