This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

AM5718: 开发gpio驱动LED灯,挂载运行,运行硬件无反应

Part Number: AM5718

驱动代码:

目录:driver/char/ledme/

文件名:ledme.C‘

#include <linux/module.h>
#include <linux/cdev.h>
#include <linux/fs.h>
#include <linux/gpio.h>
/*******************************************/
#define NAME "leds"
#define GPIO_TO_PIN(bank, gpio) (32 * (bank) + (gpio))

static int major =190;//定义主设备号
/*******************************************/
void led_on(void)
{
int tempi;
gpio_set_value(GPIO_TO_PIN(4,0), 1);
printk("led-gpio on!\n");
tempi = gpio_get_value(GPIO_TO_PIN(4,0));
printk("led-gpio value:%d\n",tempi);
}

void led_off(void)
{
int tempi;
gpio_set_value(GPIO_TO_PIN(4,0), 0);
printk("led-gpio off!\n");
tempi = gpio_get_value(GPIO_TO_PIN(4,0));
printk("led-gpio value:%d\n",tempi);
}

void led_init(void)
{
int result,valuetemp,testvalid;

valuetemp = 1;
//struct *gpio_desc;
testvalid = gpio_is_valid(GPIO_TO_PIN(4,0));
if(testvalid == 0){
printk("pin(4_0)is invalid gpio!\n");
}
printk("pin(4_0)is valid gpio and returned:%d\n",testvalid);
// Allocating GPIOs and setting direction
result = gpio_request(GPIO_TO_PIN(4,0),NAME);//usr1
//gpiod_get(struct device *dev, const char *con_id)

if (result != 0){
printk("gpio_request(4_0) failed!\n");
}else{
printk("gpio_request(4_0) ok!\n");
}
result = gpio_direction_output(GPIO_TO_PIN(4,0), valuetemp);
if (result != 0)
{
printk("gpio_direction(4_0) failed!\n");
}else{
printk("gpio_direction(4_0)->output ok,and the value :%d!\n",valuetemp);
}
}

struct light_dev
{
struct cdev cdev;
unsigned char value;
};

//struct light_dev *light_devp;
// 打开和关闭函数
int light_open(struct inode *inode,struct file *filp)
{
struct light_dev *dev;

// 获得设备结构体指针
dev = container_of(inode->i_cdev,struct light_dev,cdev);
// 让设备结构体作为设备的私有信息
filp->private_data = dev;

return 0;
}

int light_release(struct inode *inode,struct file *filp)
{
return 0;
}


// ioctl
long light_ioctl(struct file *filp,unsigned int cmd,unsigned long arg)
{
struct light_dev *dev = filp->private_data;

switch(cmd)
{
case 0:
dev->value = 0;
led_off();
break;

case 1:
dev->value = 1;
led_on();
break;

default:
return -ENOTTY;
// break;
}
return 0;
}

struct file_operations light_fops =
{
.owner = THIS_MODULE,
.unlocked_ioctl = light_ioctl,
.open = light_open,
.release = light_release,
};
// 模块加载函数
int light_init(void)
{
int ret;
led_init();
printk(KERN_ALERT "led modules is install\n");
ret=register_chrdev(major,NAME,&light_fops);
if(ret<0)
{
printk(KERN_ALERT "unable to register myled driver!\n");
return ret;
}else{
printk(KERN_ALERT "register myled driver ok!\n");
}
return 0;
}
// 版权声明
MODULE_AUTHOR ("Ao Qi <ao.qi.thu@gmail.com>");
MODULE_DESCRIPTION ("DS60_DPRAM driver");
MODULE_LICENSE("GPL");
// 模块卸载函数
void light_cleanup(void)
{
unregister_chrdev(major,NAME);
printk("Goodbye,cruel world!\n");
}

module_init(light_init);
module_exit(light_cleanup);

上面是驱动代码

下面是makefile;

export CROSS_COMPILE := arm-linux-gnueabihf-
CC := $(CROSS_COMPILE)gcc
LD := $(CROSS_COMPILE)ld

export ARCH = arm

ifneq ($(KERNELRELEASE),)
obj-m := ledme.o
else
KERNELDIR ?= /home/cys/ti-processor-sdk-linux-am57xx-evm-04.03.00.05/board-support/linux-4.9.69+gitAUTOINC+9ce43c71ae-g9ce43c71ae
PWD := $(shell pwd)


default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules ARCH=$(ARCH)
clean:
$(MAKE) -C $(KERNEL_PATH) M=$(PWD) clean
endif

驱动编译完成后生成ledme.ko,

下面是应用程序代码:

#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <linux/input.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <stdio.h>
int main(int argc, char * argv)
{
int i, n, fd;

fd = open("/dev/leds", O_RDWR);
if (fd < 0)
{
printf("can't open /dev/leds!\n");
exit(1);
}

while (1) {
ioctl(fd, 1, 1);
sleep(1);

ioctl(fd, 0, 1);
sleep(1);
}

close(fd);

return 0;
}
上面是应用程序代码

用insmod ledme.ko挂载,也成功

运行看起来正常,但是LED灯并没有变化,请问是哪里出问题了?