大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。
本次測试针对GPIO1进行,挑选了GP1[31],引脚的复用默认的就是GPIO
还是老规矩,贴上driver.c,Makefile,test.c:
dm8168_gpio.c:
代码语言:javascript复制#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 readyn");
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 exitn");
return ;
}
MODULE_LICENSE("GPL");
module_init(gpio_init);
module_exit(gpio_exit);
Makefile:
代码语言:javascript复制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:
代码语言:javascript复制#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.cn/118926.html原文链接:https://javaforall.cn