tiny6410 platform led驱动

本文介绍了一个基于S3C6410开发板的LED控制方案,通过编写内核模块实现LED的开关控制,并提供了测试程序。文章详细展示了从驱动模块到应用程序的完整流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实现了对s3c6410开发板led灯的控制

led_dev.c:

#include<linux/init.h>
#include<linux/module.h>
#include<linux/platform_device.h>
#include<linux/device.h>

#define DEVICE_NAME "tiny6410_leds"

static struct resource tiny6410_leds_resource[] = {
    [0] = {
        .start = 0x7f008800,
        .end = 0x7f008800 + 16, //16字节,包括gpkcon0,gpkcon1,gpkdat,gpkpud
        .flags = IORESOURCE_MEM,
    },
};

static void tiny6410_leds_platform_device_release(struct device *dev)
{
    printk("[remove platform_device]\n");
    return ;
}

//初始化,并添加资源
static struct platform_device tiny6410_leds_platform_device = {
    .name = DEVICE_NAME,
    .id = -1, //表示同名的驱动只有一个
    .num_resources = ARRAY_SIZE(tiny6410_leds_resource),
    .resource = tiny6410_leds_resource,
    .dev = {
        .release = tiny6410_leds_platform_device_release,
    },
};

static int __init tiny6410_leds_platform_device_init(void)
{
    printk("[tiny6410_leds_platform_device init]\n");
    return platform_device_register(&tiny6410_leds_platform_device); // >0表示添加platform_device失败
}

static void __exit tiny6410_leds_platform_device_exit(void)
{
    printk("[tiny6410_leds_platform_device exit]\n");
    platform_device_unregister(&tiny6410_leds_platform_device);
}

module_init(tiny6410_leds_platform_device_init);
module_exit(tiny6410_leds_platform_device_exit);

MODULE_AUTHOR("ZHYANG");
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("tiny6410_leds_platform_device");


led_drv.c:

#include<linux/init.h>
#include<linux/module.h>
#include<linux/fs.h>
#include<linux/platform_device.h>
#include<linux/miscdevice.h>
#include<linux/device.h>
#include<linux/pci.h>
#include<linux/uaccess.h>

#define DEVICE_NAME "tiny6410_leds"

// static struct class *tiny6410_leds_class = NULL; //miscdevice会自动创建设备节点,手动申请设备号会用到
// static struct device *tiny6410_leds_device = NULL; //这边占不演示
// 方法:在__init函数中先class_create,再device_create
//       在__exit中先device_destroy,再class_destroy

static volatile unsigned long *gpkcon0 = NULL;
static volatile unsigned long *gpkdat = NULL;

static int tiny6410_leds_open(struct inode *inode,struct file *filp)
{
    unsigned long tmp;

    //配置GPKCON0的GPK4-GPK7位为0001输出
    tmp = readl(gpkcon0);
    tmp = (tmp & ~(0xffff << 16)) | (0x1111 << 16);
    writel(tmp,gpkcon0);
    //初始化GPK4-GPK7为1,即灯灭
    tmp = readl(gpkdat);
    tmp |= (0xF << 4);
    writel(tmp,gpkdat);
    
    printk("[tiny6410_leds_open]\n");
    return 0;
}

static ssize_t tiny6410_leds_write(struct file *filp,const char __user *buf,size_t count,loff_t *ppos)
{
    char val; //1或0表示全亮灭
    unsigned long tmp;

    int ret = copy_from_user(&val,buf,count);
    // printk("[val = %c]\n",val);
    if(val=='1'){
        tmp = readl(gpkdat);
        tmp &= ~(0xf << 4);
        writel(tmp,gpkdat);
    }else{
        tmp = readl(gpkdat);
        tmp |= 0xf << 4;
        writel(tmp,gpkdat);
    }

    printk("[tiny6410_leds_write]\n");
    return ret;
}

//文件操作结构体的初始化
static struct file_operations tiny6410_leds_fops = {
    .owner = THIS_MODULE,
    .open = tiny6410_leds_open,
    .write = tiny6410_leds_write,
};

//杂项设备的初始化
static struct miscdevice tiny6410_leds_miscdevice = {
    .minor = MISC_DYNAMIC_MINOR,
    .name = DEVICE_NAME,  //特殊,name必须这么指定,因为Misc会自动创建设备节点
    .fops = &tiny6410_leds_fops,
};

static int __devinit tiny6410_leds_platform_driver_probe(struct platform_device *pdev)
{
    
    int ret;
    struct resource *res_gpk;

    ret = misc_register(&tiny6410_leds_miscdevice);//注册杂项设备
    res_gpk = platform_get_resource(pdev,IORESOURCE_MEM,0); //获取平台设备资源0
    gpkcon0 = ioremap(res_gpk->start,16); //物理地址到虚拟地址的映射
    gpkdat = gpkcon0 + 2;
    
    printk("[tiny6410_leds_platform_driver_probe]\n");
    return ret;
}

static int __devexit tiny6410_leds_platform_driver_remove(struct platform_device *pdev)
{
    iounmap(gpkcon0); //取消映射
    misc_deregister(&tiny6410_leds_miscdevice);//注销杂项设备

    printk("[tiny6410_leds_platform_driver_remove]\n");
    return 0;
}

//platform_driver初始化
static struct platform_driver tiny6410_leds_platform_driver = {
    .probe = tiny6410_leds_platform_driver_probe,
    .remove = tiny6410_leds_platform_driver_remove,
    .driver = {
        .owner = THIS_MODULE,
        .name = DEVICE_NAME,
    },
};

static int __init tiny6410_leds_platform_driver_init(void)
{
    printk("[tiny6410_leds_platform_driver_init]\n");

    return platform_driver_register(&tiny6410_leds_platform_driver); //注册平台驱动
}

static void __exit tiny6410_leds_platform_driver_exit(void)
{
    printk("[tiny6410_leds_platform_driver_exit]\n");

    platform_driver_unregister(&tiny6410_leds_platform_driver); //注销平台驱动
}

module_init(tiny6410_leds_platform_driver_init);
module_exit(tiny6410_leds_platform_driver_exit);

MODULE_AUTHOR("ZHYANG");
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("tiny6410_leds_platform_driver");


Makefile:

obj-m := led_drv.o led_dev.o

KDIR := /opt/FriendlyARM/mini6410/linux/linux-2.6.38/

all:
    make -C $(KDIR) M=$(PWD) modules

clean:
    rm -f *.ko *.o *.mod.* *.order *.symvers


测试程序test_led.c:

#include<stdio.h>
#include<fcntl.h>

int main(int argc,char **argv)
{
    int fd;
    char on; //1亮0灭

    if(argc != 2){
        printf("usage:./test_led 0|1\n");
        return -1;
    }
    on = *argv[1];
    // printf("%c\n",on);
    fd = open("/dev/tiny6410_leds",O_RDWR);
    if(fd < 0){
        printf("open device tiny6410_leds failed\n");
        return -1;
    }
    if(write(fd,&on,1) == 0)  //0表示成功
        printf("write success\n");
    else printf("write fail\n");
    
    close(fd);
    return 0;
}


步骤:

1.make生成两个.ko文件,装载到板子里,lsmod或ls /sys/bus/platform/device和driver都能看到对应的tiny6410_leds

2.arm-linux-gcc 编译生成测试程序

3.先停止板上的led流水灯:/etc/rc.d/init.d/leds stop,然后     ./test_led 0全灭   ./test_led 1全亮

内容概要:本文针对国内加密货币市场预测研究较少的现状,采用BP神经网络构建了CCi30指数预测模型。研究选取2018年3月1日至2019年3月26日共391天的数据作为样本,通过“试凑法”确定最优隐结点数目,建立三层BP神经网络模型对CCi30指数收盘价进行预测。论文详细介绍了数据预处理、模型构建、训练及评估过程,包括数据归一化、特征工程、模型架构设计(如输入层、隐藏层、输出层)、模型编译与训练、模型评估(如RMSE、MAE计算)以及结果可视化。研究表明,该模型在短期内能较准确地预测指数变化趋势。此外,文章还讨论了隐层节点数的优化方法及其对预测性能的影响,并提出了若干改进建议,如引入更多技术指标、优化模型架构、尝试其他时序模型等。 适合人群:对加密货币市场预测感兴趣的研究人员、投资者及具备一定编程基础的数据分析师。 使用场景及目标:①为加密货币市场投资者提供一种新的预测工具和方法;②帮助研究人员理解BP神经网络在时间序列预测中的应用;③为后续研究提供改进方向,如数据增强、模型优化、特征工程等。 其他说明:尽管该模型在短期内表现出良好的预测性能,但仍存在一定局限性,如样本量较小、未考虑外部因素影响等。因此,在实际应用中需谨慎对待模型预测结果,并结合其他分析工具共同决策。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值