您尚未登录。

楼主 # 2022-11-25 12:44:38

just
会员
注册时间: 2022-06-13
已发帖子: 6
积分: 31

简单的点灯求助

本人初学linux驱动,买了个sw106的套件,正好当开发板用。
板子上有两个灯,接的PE6和PE7,想用这个来实现helloword。但遇到了问题
先说一下流程,本想用设备树,但根基都不稳,还是算了,先按传统的来,于是在本论坛找了一个代码改动了一下

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/device.h>
#include <asm/uaccess.h>
#include <asm/io.h>

static struct class *SW106LedClass;

//STATUS-LED:PE7

#define PIO_BASE (0x0300B000)

volatile unsigned long *PortECFG[4] = {NULL};
volatile unsigned long *PortEData = NULL;

static int SW106LedOpen(struct inode *inode, struct file *file)
{
   //configure PE7 to output mode
   uint32_t lastValue = *PortECFG[0];
   lastValue &= 0x1fffffff;
   *PortECFG[0] &= lastValue;
   printk("led opened %ld\n",*PortECFG[0]);
   return 0;
}

static ssize_t SW106LedWrite(struct file *file, const char __user *buf, size_t count, loff_t *ppos)
{
   int val;
   copy_from_user(&val, buf, count);
   printk("led write %d\n",val);
   if (val == 1)
      *PortEData |= (1 << 7);
   else
      *PortEData &= ~(1 << 7);

   return 0;
}

static struct file_operations SW106LedFileOp = {
      .owner = THIS_MODULE,
      .open = SW106LedOpen,
      .write = SW106LedWrite,
};

int major;

int SW106LedInit(void)
{
   major = register_chrdev(0, "led", &SW106LedFileOp);
   SW106LedClass = class_create(THIS_MODULE, "led");
   device_create(SW106LedClass, NULL, MKDEV(major, 0), NULL, "led");

   PortECFG[0] = (volatile unsigned long*)(PIO_BASE+0x24*4);
   
   PortECFG[1] = PortECFG[0] + 4;
   PortEData = (volatile unsigned long*)(PIO_BASE+0xA0);
   printk("portecfg %X portedata %X\n",PortECFG[0],PortEData);
   return 0;
}

static void SW106LedExit(void)
{
   unregister_chrdev(major, "led");
   device_destroy(SW106LedClass, MKDEV(major, 0));
   class_destroy(SW106LedClass);
   iounmap(PortECFG[0]);
}

module_init(SW106LedInit);
module_exit(SW106LedExit);

MODULE_AUTHOR("JustQin");
MODULE_DESCRIPTION("SW GPIO USER driver");
MODULE_LICENSE("GPL");

地址依据a133的用户手册
基地址
Snipaste_2022-11-25_12-17-47.png

配置模式地址
Snipaste_2022-11-25_12-17-47_20221125-1219.png

设置数据地址
Snipaste_2022-11-25_12-17-47_20221125-1220.png

最后的结果
Snipaste_2022-11-25_12-17-47_20221125-1243.png

到这儿就真不知道咋回事了,哪位能帮忙指点一下吗?不胜感激

离线

#1 2022-11-25 15:12:39

海石生风
会员
所在地: 深圳
注册时间: 2019-07-02
已发帖子: 649
积分: 782
个人网站

Re: 简单的点灯求助

学驱动动最好先仔细了解下MMU,支持进程的操作系统其内存地址都是虚拟化的即由MMU管理,故不能直接操作物理地址,要通过地址映射进行访问。

离线

#2 2022-11-25 15:37:00

落日余晖
会员
注册时间: 2019-11-23
已发帖子: 34
积分: 26.5

Re: 简单的点灯求助

在小智S3开发板上添加两个GPIO PB12/PB13 (Linux4.13), 但是却失败, 大家帮我找下问题
https://whycan.com/t_2233.html#p16357


echo 44 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio44/direction
echo 1 > /sys/class/gpio/gpio44/value    ### PB12 输出高电平
echo 0 > /sys/class/gpio/gpio44/value    ### PB12 输出低电平

离线

楼主 #3 2022-11-25 16:34:56

just
会员
注册时间: 2022-06-13
已发帖子: 6
积分: 31

Re: 简单的点灯求助

海石生风 说:

学驱动动最好先仔细了解下MMU,支持进程的操作系统其内存地址都是虚拟化的即由MMU管理,故不能直接操作物理地址,要通过地址映射进行访问。

那我采用库函数来搞算了,gpio set value 那些

离线

楼主 #4 2022-11-25 16:36:16

just
会员
注册时间: 2022-06-13
已发帖子: 6
积分: 31

Re: 简单的点灯求助

@落日余晖
你这个方式我这边试了,是可以的,你那边我就不知道了

离线

#5 2022-11-25 16:47:40

cube
会员
注册时间: 2021-03-11
已发帖子: 288
积分: 202.5

Re: 简单的点灯求助

写一个非常简单的 V3s@linux4.13-y 中断驱动
https://whycan.com/t_1261.html


再试一试中断呗

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn