硬件平台:mt7688
软件平台:原生sdk MediaTek_ApSoC_SDK_4300_20140916  linux-3.10.14内核1. 在arch/mips/ralink/dev-i2c.c 添加i2c平台设备:
static struct i2c_board_info i2c_info[] __initconst =  { {I2C_BOARD_INFO("rx8025t", 0x32), //设置device name和从机地址.platform_data = (void*)(long)500, //设置平台数据,这个值是分频系数//我们的i2c 主机驱动改了所以这个值就是分频系数,clk_peri外围时钟(25/40MHZ)除以500就是i2c传输速率},
};用到的一些flag标志,定义在linux-3.10.14.x/include/uapi/linux/i2c.h
struct i2c_msg {__u16 addr; /* slave address            */__u16 flags;
#define I2C_M_TEN       0x0010  /* this is a ten bit chip address */
#define I2C_M_RD        0x0001  /* read data, from slave to master */
#define I2C_M_STOP      0x8000  /* if I2C_FUNC_PROTOCOL_MANGLING */
#define I2C_M_NOSTART       0x4000  /* if I2C_FUNC_NOSTART */
#define I2C_M_REV_DIR_ADDR  0x2000  /* if I2C_FUNC_PROTOCOL_MANGLING */
#define I2C_M_IGNORE_NAK    0x1000  /* if I2C_FUNC_PROTOCOL_MANGLING */
#define I2C_M_NO_RD_ACK     0x0800  /* if I2C_FUNC_PROTOCOL_MANGLING */
#define I2C_M_RECV_LEN      0x0400  /* length will be first received byte */__u16 len;      /* msg length               */__u8 *buf;        /* pointer to msg data          */
};2. 8025t的驱动 drivers/char/i2c_rx8025t.c :
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/module.h>
#include <linux/types.h>
#include <linux/kdev_t.h>
#include <linux/errno.h>
#include <linux/version.h>
#include <linux/kernel.h>
#include <linux/cdev.h>
#include <linux/delay.h>
#include <linux/i2c.h>
#include <linux/slab.h>#define RX8025T_NAME       "rx8025t" //driver name,要和device name匹配
#define KBUF_SIZE           32static dev_t dev;
static struct class* rtc_class = 0;
static struct cdev* rtc_dev = 0;
static struct i2c_client* g_cli = 0;static void __exit rx8025t_exit();static int rx8025t_probe(struct i2c_client* cli, const struct i2c_device_id* id)
{g_cli = cli;//因为传输的时候要指定i2c_client所以probe设备时用全局变量把它保存下来备用。return 0;
}static int rx8025t_remove(struct i2c_client* cli)
{g_cli = 0; //移除设备时把i2c_client清除return 0;
}static int rx8025t_suspend(struct i2c_client* cli, pm_message_t mesg)
{return 0;
}static int rx8025t_resume(struct i2c_client* cli)
{return 0;
}static struct i2c_device_id rtc_id[] =
{{RX8025T_NAME, 0},{NULL, 0}
};static struct i2c_driver driver_rtc =
{.driver = {.name = RX8025T_NAME,},.id_table = rtc_id,.probe       = rx8025t_probe,.remove   = rx8025t_remove,.suspend  = rx8025t_suspend,.resume   = rx8025t_resume,
};static ssize_t rtc_read(char* kdata, int len)
{int ret;struct i2c_msg msg;msg.addr = g_cli->addr;msg.flags = (g_cli->flags & I2C_M_TEN) | I2C_M_RD;  //I2C_M_RD读模式,不带此标志默认是写//g_cli->flags & I2C_M_TEN表示把除了I2C_M_TEN之外的位清零,不改变地址模式位的值,默认还是7位地址模式msg.len = len;msg.buf = kdata;g_cli->adapter->dev.platform_data = g_cli->dev.platform_data; //设置平台数据return ((ret = i2c_transfer(g_cli->adapter, &msg, 1)) == 1) ? len : ret; //启动i2c传输
}static ssize_t rtc_write(char* kdata, int len)
{int ret;struct i2c_msg msg;msg.flags = g_cli->flags & I2C_M_TEN;  //默认写操作msg.addr = g_cli->addr;msg.len = len;msg.buf = kdata;g_cli->adapter->dev.platform_data = g_cli->dev.platform_data;return ((ret = i2c_transfer(g_cli->adapter, &msg, 1)) == 1) ? len : ret; //启动i2c传输
}static int rx8025t_open(struct inode* in, struct file* fi)
{return 0;
}static ssize_t rx8025t_read(struct file* fi, char __user *buf, size_t len, loff_t* ff)
{ssize_t t;char kdata[KBUF_SIZE];if (len > KBUF_SIZE)len = KBUF_SIZE;t = rtc_read(kdata, len);if (t > 0){if (len > t)len = t;if (copy_to_user(buf, kdata, len)){printk(KERN_INFO "copy data error\n");return -EFAULT;}}return t;
}static ssize_t rx8025t_write(struct file* fi, const char __user *buf, size_t len, loff_t* ff)
{char kdata[KBUF_SIZE];if (len > KBUF_SIZE){printk(KERN_INFO "input error %d > %d\n", len, KBUF_SIZE);return -EFAULT;}if (copy_from_user(kdata, buf, len)){printk(KERN_INFO "get input error\n");return -EFAULT;}return rtc_write(kdata, len);
}static int rx8025t_ioctl(struct file* fi, unsigned int cmd, unsigned long data)
{return -1;
}static struct file_operations file_oper =
{.owner = THIS_MODULE,.open = rx8025t_open,.read = rx8025t_read,.write = rx8025t_write,.unlocked_ioctl = rx8025t_ioctl,
};static int __init rx8025t_init(void)
{int ret;rtc_class = class_create(THIS_MODULE, "rx8025t_class"); //创建设备类if (IS_ERR(rtc_class)){printk("error : failed in creating class\n");return -1;}ret = alloc_chrdev_region(&dev, 199, 1, RX8025T_NAME);//让内核自动分配设备号if (ret < 0){class_destroy(rtc_class);printk(KERN_INFO "alloc_chrdev_region fail\n");return ret;}device_create(rtc_class, NULL, dev, NULL, "%s", RX8025T_NAME);//在类下面创建设备节点rtc_dev = cdev_alloc();if (!rtc_dev){printk(KERN_INFO "alloc cdev fail\n");ret = -1;goto error_exit;}cdev_init(rtc_dev, &file_oper);//注册file_operations结构rtc_dev->owner = THIS_MODULE;ret = cdev_add(rtc_dev, dev, 1); //添加字符设备到系统if (ret < 0){printk(KERN_INFO "cdev add fail\n");goto error_exit;}return i2c_add_driver(&driver_rtc);//注册i2c driver
error_exit:rx8025t_exit();return ret;
}static void __exit rx8025t_exit(void)
{if (rtc_dev)cdev_del(rtc_dev);//删除字符设备if (rtc_class){device_destroy(rtc_class, dev);//销毁设备class_destroy(rtc_class);//销毁类}unregister_chrdev_region(dev, 1);//释放设备号i2c_del_driver(&driver_rtc);//删除i2c driver
}
module_init(rx8025t_init);
module_exit(rx8025t_exit);MODULE_LICENSE("GPL");
MODULE_ALIAS("I2C rx8025t");
MODULE_DESCRIPTION("rx8025t i2c slave driver");

rtc芯片rx8025t在linux 3.10下的的驱动相关推荐

  1. linux ubuntu10.10下最好的音乐播放器deadbeef

    linux ubuntu10.10下最好的音乐播放器deadbeef 十一 18 无冷 Linux , Ubuntu 1,162 viewsGo to comment 推荐一款播放器Deadbeef ...

  2. ac9260网卡linux,#Linux# 在OpenSUSE下安装9260AC驱动

    9260AC是目前性价比非常高的无线驱动模块,支持千兆,蓝牙5.0等等,ngff版价格也只是70块左右,主要用于笔记本上,但是通过PCIE接口转换也可以用在一般台式机的主板上,微魔最近也在自己的台式机 ...

  3. windows10用u盘安装LINUX,Windows 10下U盘安装 Ubuntu 17.10

    原标题:Windows 10下U盘安装 Ubuntu 17.10 1 Ubuntu 17.10 Canonical已经正式发布了Ubuntu 17.10 Artful Aardvark.该Ubuntu ...

  4. Linux 设备树下的 platform 驱动实验基于正点原子IMX6ULL开发板

    1 设备树下的 platform 驱动简介 platform 驱动框架分为总线.设备和驱动,其中总线不需要我们这些驱动程序员去管理,这个是 Linux 内核提供的,我们在编写驱动的时候只要关注于设备和 ...

  5. Linux(RedHat9.0)下Alsa声卡驱动的安装

    自从装来RedHat9.0就没有听到过声音,也不知道安装了多少次声卡驱动,每种都试验过,都没有成功过,今天终于安装成功,需要的朋友可以参考一下. 首先查看一下,系统声音是否打开,有些朋友电脑没有声音, ...

  6. Linux 设备树下的 platform 驱动示例

    1.简介 基于总线.设备和驱动这样的驱动框架,Linux 内核提出来 platform 这个虚拟总线,相应的也有 platform 设备和 platform 驱动. Linux 总线设备和驱动模式 2 ...

  7. usrp运行完整linux,Ubuntu系统下USRP硬件驱动(UHD)的编译与安装

    在Ubuntu系统下USRP硬件驱动(UHD)安装最简单的方式就是直接从Ettus Research官方提供的PPA源安装,不过本文介绍的是如何从源代码进行编译与安装. 1.从PPA源安装只需要下面三 ...

  8. ati显卡驱动的安装 linux,Fedora 18 下ATI 显卡驱动的安装

    本人Fedora 18是安装在笔记本上的,AMD Radeon 6600M and 6700M Series,这是安装驱动后检测出来的结果(一直以为是76系列的,因为标签就那么贴的,没想到被着实坑了一 ...

  9. ubuntu10.10下更新无线网卡驱动

    说来,今天很郁闷. 自己很讨厌ubuntu的自动升级,于是在Synaptic中禁止linux内核升级.但是天算不如人算,不知道哪天我的ubuntu内核居然升级了. 哎,原来的linux-2.6.35- ...

  10. linux声卡驱动比windows差,Ubuntu 8.04/8.10下SB600芯片声卡驱动问题的解决

    我的台式机主板是昂达A69G, 声卡芯片是SB600,在 Ubuntu 8.04/8.10 下无法正常驱动声卡,参考了这篇E文帖子Comprehensive Sound Problem Solutio ...

最新文章

  1. HighNewTech之Job:关于人工智能领域专业的公司求职数据分析(最全)
  2. C# 深入浅出 委托与事件
  3. 数据挖掘:一个end2end完整实例
  4. CentOS 6 安装Hadoop 2.6 (二)配置Hadoop
  5. springboot-vue简单小项目搭建
  6. C#使用 System.Net.Mail发送邮件功能
  7. websockert后台定时向前端发送状态_(文末送书)手把手教你打造属于自己团队的前端小报系统...
  8. 黑群晖二合一已损毁_黑群晖DSM6.2硬盘引导二合一镜像以及安装方法
  9. linux系统安全加固
  10. Java多线程及锁相关面试题
  11. 机器学习之逻辑回归(Logistic Regression)
  12. 解决javax.persistence.EntityNotFoundException: Unable to find
  13. Misumi米思米数据线驱动无法安装
  14. java 中counter什么意思_方便适用的计数器Counter
  15. 代码性能优化--NENO编程
  16. JAVA六大设计原则 和 23种设计模式
  17. 怎么让抖音视频当做铃声android,抖音怎么提取视频里的音乐?怎么将抖音里的音乐用来做手机铃声?抖音视频提取音频的方法...
  18. htc android怎么截屏,htc手机怎样截图手机屏幕
  19. 关于rem布局以及sprit雪碧图的移动端自适应
  20. C++异常中的堆栈跟踪

热门文章

  1. 有限元方法的核心思想是什么?
  2. QGIS制作好看地形图
  3. 传输线变压器设计原理
  4. 烽火超微信息科技 服务器,智算升级 烽火超微发布新一代V6服务器
  5. 【PHP基础】实现PHP与SQL数据库的连接
  6. 计算机工程师难度排名,【2018一级造价工程师考试各个科目的难度排行榜】- 环球网校...
  7. ROS+opencv实践-cv_bridge的使用
  8. 投资捕鱼游戏市场的如何避雷?以及研发技术问题。
  9. linux下安装mysql
  10. android开发中常用的Eclipse快捷键详细整理