程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> DM8168 GPIO驅動與測試程序

DM8168 GPIO驅動與測試程序

編輯:C++入門知識

本次測試針對GPIO1進行,挑選了GP1[31],引腳的復用默認的就是GPIO

還是老規矩,貼上driver.c,Makefile,test.c:

dm8168_gpio.c:

#include 
#include 
#include 
#include  /* copy_to_user,copy_from_user */
#include 
#include 
#include 

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 
#include 
#include 

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




  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved