历史上的今天

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

正在发生

2018年10月12日 | Tiny210 IIC驱动之at24cxx访问

发布者:TranquilOasis 来源: eefocus关键字:Tiny210  IIC驱动  at24cxx访问 手机看文章 扫描二维码
随时随地手机看文章

at24cxx_dev.c驱动源码:

#include "linux/kernel.h"

#include "linux/module.h"

#include "linux/platform_device.h"

#include "linux/i2c.h"

#include "linux/err.h"

#include "linux/slab.h"

static struct i2c_board_info at24cxx_info = {    

    I2C_BOARD_INFO("at24c08", 0x50),

};

static struct i2c_client *at24cxx_client;

static int at24cxx_dev_init(void)

{

    struct i2c_adapter *i2c_adap;

    i2c_adap = i2c_get_adapter(0);

    at24cxx_client = i2c_new_device(i2c_adap, &at24cxx_info);

    i2c_put_adapter(i2c_adap);

    

    return 0;

}

static void at24cxx_dev_exit(void)

{

    i2c_unregister_device(at24cxx_client);

}

module_init(at24cxx_dev_init);

module_exit(at24cxx_dev_exit);

MODULE_LICENSE("GPL");

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

at24cxx_drv.c驱动源码:

#include "linux/kernel.h"

#include "linux/module.h"

#include "linux/platform_device.h"

#include "linux/i2c.h"

#include "linux/err.h"

#include "linux/slab.h"

#include "linux/fs.h"

#include "asm/uaccess.h"

static int major;

static struct class *class;

static struct i2c_client *at24cxx_client;

// 传入: buf[0] : addr

// 输出: buf[0] : data

static ssize_t at24cxx_read(struct file * file, char __user *buf, size_t count, loff_t *off)

{

    unsigned char addr, data;

    

    copy_from_user(&addr, buf, 1);

    data = i2c_smbus_read_byte_data(at24cxx_client, addr);

    copy_to_user(buf, &data, 1);

    return 1;

}

// buf[0] : addr

// buf[1] : data

static ssize_t at24cxx_write(struct file *file, const char __user *buf, size_t count, loff_t *off)

{

    unsigned char ker_buf[2];

    unsigned char addr, data;

    copy_from_user(ker_buf, buf, 2);

    addr = ker_buf[0];

    data = ker_buf[1];

    printk("addr = 0xx, data = 0xx\n", addr, data);

    if (!i2c_smbus_write_byte_data(at24cxx_client, addr, data))

        return 2;

    else

        return -EIO;    

}

static struct file_operations at24cxx_fops = {

    .owner = THIS_MODULE,

    .read  = at24cxx_read,

    .write = at24cxx_write,

};

static int __devinit at24cxx_probe(struct i2c_client *client,

                  const struct i2c_device_id *id)

{

    at24cxx_client = client;

        

    //printk("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__);

    major = register_chrdev(0, "at24cxx", &at24cxx_fops);

    class = class_create(THIS_MODULE, "at24cxx");

    device_create(class, NULL, MKDEV(major, 0), NULL, "at24cxx"); // /dev/at24cxx 

    

    return 0;

}

static int __devexit at24cxx_remove(struct i2c_client *client)

{

    //printk("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__);

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

    class_destroy(class);

    unregister_chrdev(major, "at24cxx");

        

    return 0;

}

static const struct i2c_device_id at24cxx_id_table[] = {

    { "at24c08", 0 },

    {}

};

// 1. 分配/设置i2c_driver 

static struct i2c_driver at24cxx_driver = {

    .driver        = {

        .name    = "100ask",

        .owner   = THIS_MODULE,

    },

    .probe       = at24cxx_probe,

    .remove     = __devexit_p(at24cxx_remove),

    .id_table    = at24cxx_id_table,

};

static int at24cxx_drv_init(void)

{

    // 2. 注册i2c_driver 

    i2c_add_driver(&at24cxx_driver);

    

    return 0;

}

static void at24cxx_drv_exit(void)

{

    i2c_del_driver(&at24cxx_driver);

}

module_init(at24cxx_drv_init);

module_exit(at24cxx_drv_exit);

MODULE_LICENSE("GPL");

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

i2c_test.c测试程序:

#include "stdio.h"

#include "stdlib.h"

#include "string.h"

#include "sys/types.h"

#include "sys/stat.h"

#include "fcntl.h"

// i2c_test r addr

// i2c_test w addr val

void print_usage(char *file)

{

    printf("%s r addr\n", file);

    printf("%s w addr val\n", file);

}

int main(int argc, char **argv)

{

    int fd;

    unsigned char buf[2];

    

    if ((argc != 3) && (argc != 4))

    {

        print_usage(argv[0]);

        return -1;

    }

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

    if (fd < 0)

    {

        printf("can't open /dev/at24cxx\n");

        return -1;

    }

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

    {

        buf[0] = strtoul(argv[2], NULL, 0);

        read(fd, buf, 1);

        printf("data: %c, %d, 0x%2x\n", buf[0], buf[0], buf[0]);

    }

    else if ((strcmp(argv[1], "w") == 0) && (argc == 4))

    {

        buf[0] = strtoul(argv[2], NULL, 0);

        buf[1] = strtoul(argv[3], NULL, 0);

        if (write(fd, buf, 2) != 2)

            printf("write err, addr = 0xx, data = 0xx\n", buf[0], buf[1]);

    }

    else

    {

        print_usage(argv[0]);

        return -1;

    }

    

    return 0;

}


关键字:Tiny210  IIC驱动  at24cxx访问 引用地址:Tiny210 IIC驱动之at24cxx访问

上一篇:Tiny210字符设备驱动的另外一种写法
下一篇:Tiny210驱动之虚拟网卡驱动

推荐阅读

tiny_nand.c驱动源码:#include "linux/module.h"#include "linux/types.h"#include "linux/init.h"#include "linux/kernel.h"#include "linux/string.h"#include "linux/ioport.h"#include "linux/platform_device.h"#include "linux/delay.h"#include "linux/err.h"#include "linux/slab.h"#include "linux/clk.h"#include "linux/cpufreq.h...
以MSP430Fr6972为例简:1)进入ti官网:http://www.ti.com.cn/2)在搜索栏填入:msp430fr6972 点击go on3)点击第一个搜索结果(一般第一个就可以,可以尝试看看)。4)点击右边红色按钮“软件和工具” 在培训内容里面找到“MSP430Fr6972 Code Examples ”5)点击下载即可。
MPX4115压力传感器AT89c51单片机LED共阳极显示 单片机最小系统显示模块AD0832与单片机的连接传感器与AD的连接单片机源程序如下:#include <reg51.h>#include <intrins.h>//ADC0832 引脚sbit ADCS=P2^0;sbit ADDI=P3^7;sbit ADDO=P3^7;sbit ADCLK=P3^6;unsigned char dispbitcode[8]={0xF7,0xFB,0xFD,0xFE,0xEF,0xDF,0xBF,0x7F}; //位扫描unsigne...
继《谈谈汽车芯片安全-上篇》之后,本文针对芯片安全存储、FOTA、安全诊断、安全运行环境做了进一步阐述。1. 安全存储1.1 OTP存储器 一次性可编程存储器(On Chip One Time Programmable ROM, On-Chip OTP ROM)OTP存储器,也称为eFuse,是芯片中特殊存储模块;字段中的任何eFuse位都只能从0编程为1(融合),但是读取操作没有限制。OTP在安全中的...

史海拾趣

问答坊 | AI 解惑

嵌入式

请问有谁能给我点嵌入式之路方面的建议嘛?…

查看全部问答∨

使用VxWorks时出现了问题,请教各位,给点儿建议!cpu是MPC862

自己编了个小程序,在Tornador里结合VxWorks一起. 程序很简单,就是读存储器! xd0 = *(unsigned int *)(SDRAM_ADR); xd1 = *(unsigned int *)(BOOTFLASH_ADR); xd2 = *(unsigned short int *)(FLASH_ADR); 我的存储器有三种,一个是SDRAM,32位;一 ...…

查看全部问答∨

热地和冷地,你听过吗?

热地:开关电源无需使用变压器,其开关电路的“地”和市电电网有关,既所谓的“热地”,它是带电的 冷地:由于开关电源的高频变压器将输入、输出端隔离;又由于其反馈电路常用光电耦合、既能传送反馈信号又将双方的“地”隔离;所以输出端的地称之 ...…

查看全部问答∨

ST10资料上载

我有一批ST10的资料可以上载吗?供大家参考。大约10M的大小,对ST10的开发非常有帮助。…

查看全部问答∨

关于IAR4.42和STM32疑难杂症(已解决.使用IAR5.30)

请各位大虾诊断!开发平台 (IAR4.42(带补丁)+ JLINK + STM32 + uCOS-II v2.86)写的源代码在自己的PC上运行很正常, 但把整个工程到其他两个同事的PC上都出现了同一个问题!系统中有一个TIM6的定时中断, ...…

查看全部问答∨

STM32101VCT6SRAM(62256)cpld7128lcd12232测试版电路

attach]20052[/attach]原理图 这个是62256的电路,贴出来 下载 (950.99 KB) 2010-3-26 10:05 电路描述:FSMC_NADV经非门后接573的锁存脚,FSMC_NE1接62256的片选/CS,FSMC_NOE接62256的/OE,FSMC_NOE接62256的/WE STM ...…

查看全部问答∨

【晒经典】集成运算放大电路篇

本帖最后由 dontium 于 2015-1-23 11:43 编辑 本帖主要回顾集成运放在电路中的使用,即集成运算放大电路,前两贴作为此贴的基础,我采用循序渐进的阐述方法   1.F007放大电路   F007是通用型集成运放,它由正负15V两路电源供电。从+ ...…

查看全部问答∨

想换个万用表了

手头有个用了三四年的万用表。一个普及型很普通的DT9205三位半,厂家是 福克,是的是的,山寨之风吹响各个领域,虽然我不至于当初啥都不懂把它当成大名鼎鼎的福禄克,但我必须承认,我当时真因为这个名字才把它拿在手上开始琢磨。这东西也便宜,35 ...…

查看全部问答∨

飞思卡尔单片机与rf905的通信spi通信问题

我是一个新人,对飞思卡尔单片机使用的不是很熟,最近在使用飞思卡尔128单片机和nrf905之间做一个无线传输的小协议,选择飞思卡尔为主机模式,并且作为接收终端,用于接收我的发送数据。我的发送端是用51做到已经好使了,没有问题了(发送端暂且不 ...…

查看全部问答∨

请求 继续团购 MSP430 LaunchPad MSP-EXP430G2 25元不用包邮啊

请求 继续团购 MSP430 LaunchPad MSP-EXP430G2&nbsp; 25元不用包邮啊 30元 也可以试试 [ 本帖最后由 ppiicc 于 2012-5-3 22:53 编辑 ]…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved