历史上的今天
返回首页

历史上的今天

今天是:2024年10月12日(星期六)

正在发生

2018年10月12日 | Tiny210驱动之LED测试

2018-10-12 来源:eefocus

first_drv.c驱动源码:

#include "linux/device.h"

#include "linux/module.h"

#include "linux/kernel.h"

#include "linux/fs.h"

#include "linux/init.h"

#include "linux/delay.h"

#include "asm/uaccess.h"

#include "asm/irq.h"

#include "asm/io.h"

static struct class *firstdrv_class;

volatile unsigned long *gpj2con = NULL;

volatile unsigned long *gpj2dat = NULL;

static int first_drv_open(struct inode *inode, struct file *file)

{

    // 配置GPJ2_0,GPJ2_1,GPJ2_2,GPJ2_3为输出 

    *gpj2con &= ~((0xf<<(0*4)) | (0xf<<(1*4)) | (0xf<<(2*4)) | (0xf<<(3*4)));

    *gpj2con |= ((0x1<<(0*4)) | (0x1<<(1*4)) | (0x1<<(2*4)) | (0x1<<(3*4)));

    return 0;

}

static ssize_t first_drv_write(struct file *file, const char __user *buf, size_t count, loff_t * ppos)

{

    int val;

    copy_from_user(&val, buf, count); //    copy_to_user();

    if (val == 1)

    {

        // 点灯

        *gpj2dat &= ~((1<<0) | (1<<1) | (1<<2) | (1<<3));

    }

    else

    {

        // 灭灯

        *gpj2dat |= (1<<0) | (1<<1) | (1<<2) | (1<<3);

    }

    

    return 0;

}

static struct file_operations first_drv_fops = {

    .owner  = THIS_MODULE,    // 这是一个宏,推向编译模块时自动创建的__this_module变量 

    .open   = first_drv_open,     

    .write  = first_drv_write,       

};

int major;

static int first_drv_init(void)

{

    major = register_chrdev(0, "first_drv", &first_drv_fops); // 注册, 告诉内核

    firstdrv_class = class_create(THIS_MODULE, "firstdrv");

    device_create(firstdrv_class, NULL, MKDEV(major, 0), NULL, "xyz"); // /dev/xyz 

    gpj2con = (volatile unsigned long *)ioremap(0xE0200280, 16);

    gpj2dat = gpj2con + 1;

    return 0;

}

static void first_drv_exit(void)

{

    unregister_chrdev(major, "first_drv"); // 卸载

    device_destroy(firstdrv_class, MKDEV(major, 0));

    class_destroy(firstdrv_class);

    iounmap(gpj2con);

}

module_init(first_drv_init);

module_exit(first_drv_exit);

MODULE_LICENSE("GPL");

====================================================================

firstdrvtest.c测试程序:

#include "sys/types.h"

#include "sys/stat.h"

#include "fcntl.h"

#include "stdio.h"

// firstdrvtest on

// firstdrvtest off

int main(int argc, char **argv)

{

    int fd;

    int val = 1;

    fd = open("/dev/xyz", O_RDWR);

    if (fd < 0)

    {

        printf("can't open!\n");

    }

    if (argc != 2)

    {

        printf("Usage :\n");

        printf("%s 《on|off》\n", argv[0]); //实际为"<"

        return 0;

    }

    if (strcmp(argv[1], "on") == 0)

    {

        val  = 1;

    }

    else

    {

        val = 0;

    }

    

    write(fd, &val, 4);

    return 0;

}


推荐阅读

史海拾趣

Hi-Optel Technologly Co Ltd公司的发展小趣事

Hi-Optel Technologly Co Ltd在电子行业中的五个发展故事

故事一:创立与初期发展

Hi-Optel Technologly Co Ltd(以下简称Hi-Optel)成立于1999年,由国有大型上市公司和国内著名风险投资机构共同投资,注册资本高达1亿美元。公司自创立之初便专注于光纤通信领域的模块开发、制造和营销。初期,Hi-Optel面临着技术挑战和市场开拓的双重压力,但凭借其强大的研发实力和敏锐的市场洞察力,逐步在光纤收发器、TO-CAN等关键产品的研发上取得突破,为后续的快速发展奠定了坚实基础。

故事二:技术创新与产品线拓展

随着技术的不断进步,Hi-Optel持续加大研发投入,不断推出新产品以满足市场需求。公司不仅拥有从TO-CAN到光纤收发器等完整产品的研发、生产和处理能力,还涵盖了不同速率和不同封装传输和数据通信的主动模块。这些产品广泛应用于SONET、以太网、FTTx、LTE和IDC光纤传输/接入系统,极大地提升了公司在行业内的竞争力。同时,Hi-Optel还积极拓展产品线,将业务范围延伸至更广泛的电子通信领域。

故事三:市场拓展与品牌建设

在市场拓展方面,Hi-Optel采取了多种策略以扩大市场份额。公司积极参加国内外各类电子通信展会,展示其最新技术和产品,吸引了众多客户和合作伙伴的关注。同时,Hi-Optel还注重品牌建设,通过提升产品质量和服务水平,赢得了客户的广泛好评。此外,公司还建立了完善的销售网络和售后服务体系,为客户提供全方位的支持和服务。

故事四:供应链优化与成本控制

为了应对激烈的市场竞争,Hi-Optel不断优化供应链管理,降低生产成本。公司与多家优质供应商建立了长期稳定的合作关系,确保原材料的稳定供应和质量的可靠性。同时,Hi-Optel还通过引入先进的生产设备和工艺,提高生产效率和产品质量,进一步降低了生产成本。这些措施不仅增强了公司的市场竞争力,还为公司的可持续发展提供了有力保障。

故事五:国际化战略与全球化布局

随着全球化进程的加速,Hi-Optel积极实施国际化战略,拓展海外市场。公司成立了多个海外分支机构,并在多个国家和地区建立了销售网络和售后服务体系。通过与国际知名企业的合作与交流,Hi-Optel不断提升自身的技术水平和品牌影响力。同时,公司还积极参与国际标准和规范的制定工作,推动行业技术的进步和发展。这些努力使得Hi-Optel在全球电子通信领域的影响力日益增强。

Arcolectric公司的发展小趣事

Arcolectric深知合作伙伴的重要性,因此一直致力于与全球各地的优质企业建立紧密的合作关系。通过与这些合作伙伴的深入合作,Arcolectric不仅获得了更多的市场机会和资源支持,还不断吸收和借鉴先进的经验和技术,推动公司的持续发展和创新。

Cybernetic Micro Systems公司的发展小趣事

随着业务的不断发展,CMS开始将目光投向国际市场。他们通过设立海外研发中心和生产基地,积极拓展海外市场。同时,CMS还加强了与国际知名企业的合作与交流,共同推动电子行业的发展。如今,CMS的产品已经遍布全球多个国家和地区,成为电子行业中不可忽视的一股力量。

大毅科技公司的发展小趣事

随着业务的不断增长,大毅科技意识到需要扩大生产规模以满足市场需求。于是,公司开始在大陆地区寻找合适的生产基地,最终在东莞、清溪、苏州等地设立了生产基地。这一举措不仅降低了生产成本,还提高了生产效率,使大毅科技能够更好地服务全球客户。同时,这也体现了大毅科技对全球市场的战略眼光和布局。

Astec [Astec America, Inc]公司的发展小趣事

随着技术的不断成熟和市场的不断扩大,Astec开始积极寻求市场拓展的机会。公司不仅加大了在国内市场的宣传力度,还通过参加国际电子展会等方式,将产品推向了国际市场。同时,Astec还注重品牌形象的建立,通过提供优质的产品和服务,逐渐树立了良好的品牌形象。

Flamar公司的发展小趣事

在追求经济效益的同时,Flamar公司始终不忘履行企业社会责任。公司积极响应全球绿色可持续发展号召,将环保理念融入产品研发、生产和销售的各个环节。通过采用环保材料、优化生产工艺、推广节能产品等措施,Flamar公司有效降低了产品生命周期中的环境影响。此外,公司还积极参与公益事业和社会活动,为推动电子行业的绿色可持续发展贡献自己的力量。

问答坊 | AI 解惑

智能手机上可以使用的3G模组都有哪些?

我们现在需要用ARM的CPU做两款产品,一个是Netbook,一个是Barcode scanner,都需要加上CDMA2000/EVDO/HSxPA的3G模组,其中Netbook使用Android系统,Barcode scanner使用WM6.5系统,请问大家在开发类似产品的时候使用的都是哪家的3G模组呢? 我有 ...…

查看全部问答>

为什么将GPIO配置成中断模式后,GPGDAT就不能读了??

    将GPIO如GPG端口中的GPG1配置成中断模式(GPGCON中配的),这样的话GPGDAT就不能读了吧(至少2440的datasheet上是这么说的)?     但是我看别人写的驱动怎么将GPG配成了中断模式,却用读取GPGDAT的相应位来判断是否产 ...…

查看全部问答>

Windows Mobile 5.0,Windows Mobile 60设备,如何在我的程序运行过程中禁用上面的Power电源按钮

Windows Mobile 5.0,Windows Mobile 60设备,如何在我的程序运行过程中禁用上面的Power电源按钮…

查看全部问答>

如何上传图片?ADS调试C和汇编混合编程 只显示反汇编内容 怎么按照C逐行调试

就这么多分了   如题问题 不知道怎么上传图片 知道告诉一声…

查看全部问答>

源码请教,关于Tab Ctrl 的多对话框共享从串口采集的数据,怎么实现啊?

现在有个项目,28号就要,很急,没实现Tab Ctrl 的多对话框共享从串口采集的数据,有四个对话框,每个对话框分别有很多的控件,要显示从串口采集来的数据,怎么样才能实现共享啊,请大家帮帮忙!!! 其中Tab Ctrl 的多对话框主要使用下面的方案5实 ...…

查看全部问答>

ST32X103做电机控制好得不得了,服务也天下第一好.

                                 ST32X103做电机控制好得不得了,服务也天下第一好.…

查看全部问答>

stm32f107phy搭配问题

                                 最近想寻找一款PHY,工业级要求,10-100M的,dp83848或者类似产品,想找一款价格和货期合适的,不知道大家有什么建 ...…

查看全部问答>

建议增加psoc版块

  psoc是赛普拉斯半导体公司生产的可编程片上系统,具有模拟系统和数字系统,学校做工程实践时候用到,现在正在学习,希望本论坛能够增加这个版块给大家学习交流。…

查看全部问答>

无线通信模块在M2M领域的应用(四)

无线通信模块在M2M领域的应用(四) 传统农业生产的物质技术手段落后,主要依靠人力、畜力和各种手工工具以及一些简单机械。在现实中主要存在农业科技含量低,装备水平低,农业污染和水资源浪费严重,农业产出少,农民收入低,农产品品种少等问题。 ...…

查看全部问答>

F28027用SPI操作SD卡

大家好,最近在做一个比赛,需要使用SD卡来记录工作状态下的数据。但是对于文件系统和怎样对于SD卡进行操作不是很了解,所以和大家商讨一下。我先把我的两个函数放上来,大家帮我看看。 了、我没有使用FIFO功能,因为我觉得对于SD卡返回的信息的读 ...…

查看全部问答>