Hi35xx GPIO在ko中设置

添加链接描述
参考了这位大神的程序;

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/device.h>
#include <asm/uaccess.h>
#include <asm/irq.h>
#include <asm/io.h>
 
#define DEV_NAME "led"
 
/* led */
#define GPIO6_BASE_ADDR          	0x120b6000
#define GPIO6_DIR_ADDR            ((GPIO6_BASE_ADDR) + (0x400))
#define GPIO6_DATA_OUT_ADDR       ((GPIO6_BASE_ADDR) + (0x000))
#define GPIO6_7_SET_DATA__ADDR    ((GPIO6_DATA_OUT_ADDR) + (0x200))
 
 
volatile unsigned long *gpio6_dir = NULL;
volatile unsigned long *gpio6_dataout = NULL;
volatile unsigned long *gpio6_setdata = NULL;
/* led end */
 
static int major = (-1); /* 初始化为无效值 */
static struct class *led_drv_class;
 
static int led_drv_open(struct inode *inode, struct file *file)
{
    /* 将dir寄存器bit7置1:表示output功能 */
    *gpio6_dir |= (1<<7);
 
    return 0;
}
 
static int led_drv_release(struct inode *pinode , struct file *pfile)
{
    /* 将data寄存器置1,表示输出高电平 */
    //*gpio6_setdata = (1<<7);
 
    return 0;
}
 
static ssize_t led_drv_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)
{
	char val;
	int ret;
	
	ret = copy_from_user(&val, buf, count);
	
	if(!ret)
	{
		*gpio6_setdata = val;
	}
    	
 
    return 0;
}
 
static struct file_operations led_drv_fops = {
    .owner   = THIS_MODULE,
    .open    = led_drv_open,
    .release = led_drv_release,
    .write   = led_drv_write,
};
 
/* 驱动入口函数 */
static int led_drv_init(void)
{
    major = register_chrdev(0, "led_drv", &led_drv_fops); // 注册, 告诉内核,返回值major为自动分配的主设备号
 
    led_drv_class = class_create(THIS_MODULE, "leddrv");
    device_create(led_drv_class, NULL, MKDEV(major, 0), NULL, DEV_NAME); /* insmod xxx后,会自动生成/dev/xyz设备,并且自动给该设备分配主设备号major */
 
    /* 映射寄存器地址 */
    gpio6_dir      = (volatile unsigned long *)ioremap(GPIO6_DIR_ADDR, 32);
    gpio6_dataout = (volatile unsigned long *)ioremap(GPIO6_DATA_OUT_ADDR, 32);
    gpio6_setdata = (volatile unsigned long *)ioremap(GPIO6_7_SET_DATA__ADDR, 32);
 
    return 0;
}
 
/* 驱动出口函数 */
static void led_drv_exit(void)
{
    unregister_chrdev(major, "led_drv"); /* 卸载驱动程序,告诉内核 */
 
    device_destroy(led_drv_class, MKDEV(major, 0));
    class_destroy(led_drv_class);
 
    /* 删除映射关系 */
    iounmap(gpio6_setdata);
    iounmap(gpio6_dataout);
    iounmap(gpio6_dir);
}
 
module_init(led_drv_init);
module_exit(led_drv_exit);
 
MODULE_LICENSE("Dual BSD/GPL");
 

可以简单粗暴操作:
*gpio6_dir |= (1<<7);
*gpio6_setdata = 0xff; //高电平

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
 
 
 
/*
  *  ledtest <dev> <on|off>
  */
void print_usage(char *file)
{
    printf("Usage:\n");
    printf("%s <dev> <on|off>\n",file);
    printf("eg. \n");
    printf("%s /dev/leds on\n", file);
    printf("%s /dev/leds off\n", file);
    printf("%s /dev/led1 on\n", file);
    printf("%s /dev/led1 off\n", file);
}
 
 
int main(int argc, char **argv)
{
    int fd;
    char* filename=NULL;
    char val;
    
	if(argc !=3)
    {
        print_usage( argv[1]);//打印用法
    }
	
    filename = argv[1];
    
    fd = open(filename, O_RDWR);//打开dev/firstdrv设备文件
    if (fd < 0)//小于0说明没有成功
    {
        printf("error, can't open %s\n", filename);
        return 0;
    }
    
    
 
    if(!strcmp(argv[2], "on"))
       val = (1<<7);   //此处驱动的GPIO6_7属于第7个引脚,所以需要把bit7置1
    else
       val = 0;
   
    write(fd, &val, 1);//操作LED
	printf("Set led GPIO to %d\n",val);
	
	close(fd);
    
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值