mini2440 linuxi2c驱动

#include <linux/kernel.h> #include <linux/init.h> #include <linux/module.h> #include <linux/slab.h> #include <linux/delay.h> #include <linux/mutex.h> #include <linux/sysfs.h> #include <linux/mod_devicetable.h> #include <linux/log2.h> #include <linux/bitops.h> #include <linux/jiffies.h> #include <linux/i2c.h> #include <linux/i2c/at24.h> #include <linux/fs.h> #include <asm/uaccess.h>

static struct i2c_client  *at24_client;

static int major=0;

static struct class  *cls;

static const struct i2c_device_id at24_ids[] = {

{"at24",8},    {}, };

MODULE_DEVICE_TABLE(i2c,at24_ids);

static ssize_t at24_read(struct file *file, char __user *buf, size_t len, loff_t *offset)

{  unsigned char address;

unsigned char data;

struct i2c_msg msg[2];

int ret;

if(len!=1)   return -EINVAL;  copy_from_user(&address,buf,1);  msg[0].addr=at24_client->addr;  msg[0].buf=&address;  msg[0].len=1;  msg[0].flags=0;  msg[1].addr=at24_client->addr;  msg[1].buf=&data;  msg[1].len=1;  msg[1].flags =I2C_M_RD;  ret=i2c_transfer(at24_client->adapter,msg,2);  if(ret==2)   {    copy_to_user(buf,&data,1);    return 1;   }  else   return -EIO;  printk("read !\n");  return 0; } static ssize_t at24_write(struct file *file, const char __user *buf, size_t len, loff_t *offset) {  unsigned char val[2];  struct i2c_msg msg[1];  int ret;  if(len!=2)   return -EINVAL;  copy_from_user(val,buf,2);  msg[0].addr=at24_client->addr;  msg[0].buf=val;  msg[0].len=2;  msg[0].flags=0;  ret=i2c_transfer(at24_client->adapter,msg,1);  if(ret==1)  {   return 2;  }  else   return -EIO;  printk("write !\n");  return 0; }

static struct file_operations fop={  .owner =THIS_MODULE,  .write  =at24_write,  .read   =at24_read, }; static int at24_probe(struct i2c_client *client, const struct i2c_device_id *ids) {  printk("probe ok!\n");  at24_client=client;  major=register_chrdev(0,"at24",&fop);  cls=class_create(THIS_MODULE,"at24");  device_create(cls,NULL,MKDEV(major,0),NULL,"at24");  return 0; } static int at24_remove(struct i2c_client *client) {  kfree(at24_client);  unregister_chrdev(major,"at24");  device_destroy(cls,MKDEV(major,0));  class_destroy(cls);  printk("remove ok!\n");  return 0; }

static struct i2c_driver at24cx_driver = {  .driver = {   .name = "at24",   .owner = THIS_MODULE,  },  .probe = at24_probe,  .remove = at24_remove,  .id_table =at24_ids,   };

static int at24cx_init(void) {  return i2c_add_driver(&at24cx_driver); }

static void at24cx_exit(void) {  i2c_del_driver(&at24cx_driver); } module_init(at24cx_init); module_exit(at24cx_exit); MODULE_LICENSE("GPL");

static struct at24_platform_data at24_i2c_info = {

.byte_len = 8,  .page_size = 8, };

static struct i2c_board_info at24_i2c_devices[] =

{   {         I2C_BOARD_INFO("at24", 0x50),

.platform_data = &at24_i2c_info,          },

};

时间: 2024-11-10 01:25:40

mini2440 linuxi2c驱动的相关文章

linux-I2C驱动

I2C体系结构 linux的I2C体系结构分为3个组成部分: (1) I2C核心.提供I2C总线驱动和设备驱动的注册和注销方法. (2) I2C总线驱动.对适配器端的实现. (3) I2C设备驱动.设备端的实现. 整个体系架构如图: I2C设备在sysfs文件系统中显示在sys/bus/i2c目录,例如: 理解i2c体系结构,首先要理解i2c_driver.i2c_client.i2c_adapter和i2c_algorithm这四个数据结构.这四个数据结构均在i2c.h在定义: struct

Mini2440 led驱动

Mini2440 led驱动 Mini2440_leds.c 代码: #include <linux/miscdevice.h> #include <linux/delay.h>  //延时函数的头文件 #include <asm/irq.h> #include <mach/regs-gpio.h> #include <mach/hardware.h> //硬件相关的函数 #include <linux/kernel.h>      

linux字符设备驱动

一.字符设备.字符设备驱动与用户空间访问该设备的程序三者之间的关系. 如图,在Linux内核中使用cdev结构体来描述字符设备,通过其成员dev_t来定义设备号(分为主.次设备号)以确定字符设备的唯一性.通过其成员file_operations来定义字符设备驱动提供给VFS的接口函数,如常见的open().read().write()等. 在Linux字符设备驱动中,模块加载函数通过register_chrdev_region( ) 或alloc_chrdev_region( )来静态或者动态获

SylixOS nand驱动框架理解

1.适用范围 该应用笔记适用于帮助用户在SylixOS下使用nandflash器件. 2.原理概述 2.1nandflash存储结构 nandflash存储结构如图2-1所示,下面以mini2440开发板上的k9f1g08系列nandflash为例,简单介绍nandflash的存储结构. 图2-1 nandflash存储结构 nandflash的存储结构主要有两个单位:页(page),块(block).每页大小为2K+64字节,2K用来存储数据,64字节用来存储控制信息(OOB区,例如坏块信息.

S3C2440之Camera驱动代码模板(RealView MDK)

好记心不如烂笔头,为方便以后查看代码及代码重复利用,这里贴出S3C2440 Camera驱动代码.使用友善MINI2440开发板,开发环境为RealView MDK 4.22. 原始工程下载地址:点击打开链接 最初,本人在网上下载了许多mini2440 camera驱动的代码,但结果都不尽人意,因为这些代码看起来都比较晦涩难懂,都是直接对寄存器进行位与位或操作,且有的代码排版布局很乱,对初学者来说难度较大.由于本人接触了STM32开发后,觉得STM32的库函数给初学者提供了很大帮助,仅仅通过函数

DM9000驱动移植在mini2440(linux2.6.29)和FS4412(linux3.14.78)上的实现(deep dive)篇一

关于dm9000的驱动移植分为两篇,第一篇在mini2440上实现,基于linux2.6.29,也成功在在6410上移植了一遍,和2440非常类似,第二篇在fs4412(Cortex A9)上实现,基于linux3.14.78,用设备树匹配,移植过程中调试和整体理解很重要,一路上幸有良师益友指点,下面详细介绍: 1.物理时序分析相关 DM9000芯片是DAVICOM公司生产的一款以太网处理芯片,提供一个通用的处理器接口.一个10/100M自适应的PHY芯片和4K双字的SRAM.内部框架如下,涉及

mini2440驱动奇谭——LED驱动与测试(动态加载)

我的博客:http://blog.csdn.net/muyang_ren 实现功能:开发板动态加载led驱动模块并能通过测试程序 系统:Ubuntu 14.04 驱动交叉编译内核:linux-2.6.32.2               //建立交叉编译 开发板:mini2440 (128M nandflash)     //关于怎么烧写linux到开发板请点击,Linux RootFs 选择rootfs_rtm_2440.img  (光盘目录:image/linux/rtm ) 开发所需工具:

mini2440移植uboot-2008.10 (二) DM9000网卡驱动移植

还是利用 mini2440移植uboot-2008.10 (一)  修改好的代码 通过观察可以发现,mini2400使用的网卡芯片是DM9000,在uboot-2008.10源码中已经支持该芯片的驱动(drivers/net/dm9000.c),但是并不完善 具体原理还不是很清楚,现在只是做一下移植步骤的记录 1.修改uboot配置文件(include/configs/mini2440.h) 53 /* 54 * Hardware drivers 55 */ 56 #if 0 57 #defin

【内核】四、搭建完整的mini2440开发板驱动开发环境(仿照JZ2440驱动开发环境搭建)

一.mini2440开发板驱动环境搭建: <mini2440用户手册>说明原文>>注意:本开发板提供的 linux 内核并不能直接用于 u-boot ,因为我们公司是不使用u-boot的,并且对其各个参数设置并不了解,关于 U-Boot 的使用方法用户可以参考网上的资料. 我了个...鉴于使用免费版的mini2440光盘资料,驱动开发环境搭建从未成功过,罢了,虽然以后LCD和触摸屏驱动学习时会有些问题,但还是换熟悉的u-boot和uImage来搭建环境吧. 二.在mini2440开