本次测试针对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

浙公网安备 33010602011771号