历史上的今天
返回首页

历史上的今天

今天是:2024年12月30日(星期一)

正在发生

2021年12月30日 | 4412 移植mpu9250尝试

2021-12-30 来源:eefocus

4412的板子IO都是1.8v的。只有I2C6是用了电平转换到了3.3v。所以我准备使用I2C6来驱动mpu9250


一、首先去掉占用的模块

menuconfig中去掉触摸的驱动

  • Device Drivers  --->

  • Input device support  --->

  • Touchscreens  --->

  • FT5X0X based touchscreens(去掉)

然后是去掉RC522的驱动(SPI占用I2C了)

  • Device Drivers  --->

  • SPI support   --->

  • < >   RC522 Module driver support(去掉)

-> Networking support (NET [=y])                                 
-> CAN bus subsystem support (CAN [=y])                        
 -> CAN Device Drivers                                          
-> Platform CAN drivers with Netlink support (CAN_DEV [=y])

    < >   Microchip MCP251x SPI CAN controllers


二、在mach-itop4412.c中添加设备

static struct i2c_board_info i2c_devs6[] __initdata = {
    {
        I2C_BOARD_INFO("mpu9250", MPU9250_ADDRESS),
    },
};


这里的MPU9250_ADDRESS应该是7位的,如果写0XD0,就是MPU9250_ADDRESS>>1

然后内核编译后,烧录进开发板


cat /sys/bus/i2c/devices下就会有6-0068,这个文件了

 

写了一个空的I2C模版:

 i2c_9250.c

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include


#include


#include

#include

#include


#define I2C6_9250_NAME "mpu9250"


#define I2C_SDA6    EXYNOS4_GPC1(3)

#define I2C_SCL6    EXYNOS4_GPC1(4)


static int i2c_mpu9250_probe(struct i2c_client *client, const struct i2c_device_id *id)

{

    printk("==%s: n", __FUNCTION__);

    return 0;

}


static int __devexit i2c_mpu9250_remove(struct i2c_client *client)

{

    i2c_set_clientdata(client, NULL);               //设置client为NULL

    printk("==%s: n", __FUNCTION__);

    return 0;

}


static const struct i2c_device_id i2c_mpu9250_id[] = {

    { I2C6_9250_NAME, 0 },

    { }

};


static struct i2c_driver i2c_mpu9250_driver = {

    .probe = i2c_mpu9250_probe,

    .remove = __devexit_p(i2c_mpu9250_remove),

    .id_table = i2c_mpu9250_id,

    .driver = {

        .name  = I2C6_9250_NAME,

        .owner = THIS_MODULE,

    },

};


static void i2c_io_init()

{

    int ret;

    ret = gpio_request(I2C_SCL6, "I2C_SCL6");

    if(ret) {

        printk(KERN_ERR "failed to request TP1_EN for I2C controln");

    }


    gpio_direction_output(I2C_SCL6, 1);

    s3c_gpio_cfgpin(I2C_SCL6, S3C_GPIO_OUTPUT);

    gpio_free(I2C_SCL6);


    mdelay(5);


    ret = gpio_request(I2C_SDA6, "I2C_SDA6");

    if(ret) {

        gpio_free(I2C_SDA6);


        ret = gpio_request(I2C_SDA6, "I2C_SDA6");

        if(ret) {

            printk("i2c_io_test: Fialed to request I2C_SDA6 n");

        }

    }

    gpio_direction_output(I2C_SDA6, 0);

    mdelay(200);


    gpio_direction_output(I2C_SDA6, 1);


    s3c_gpio_cfgpin(I2C_SDA6, S3C_GPIO_OUTPUT);

    gpio_free(I2C_SDA6);

    msleep(300);

    printk("==%s: n", __FUNCTION__);

}


static int __init i2c_mpu9250_init(void)

{

    printk("==%s: n", __FUNCTION__);

    i2c_io_init();

    return i2c_add_driver(&i2c_mpu9250_driver);

}


static void __exit i2c_mpu9250_exit(void)

{

    printk("==%s: n", __FUNCTION__);

    i2c_del_driver(&i2c_mpu9250_driver);

}


late_initcall(i2c_mpu9250_init);       //延迟加载

module_exit(i2c_mpu9250_exit);


MODULE_LICENSE("GPL");

MODULE_DESCRIPTION("mpu9250");

MODULE_AUTHOR("ChenTuo");

 

三、I2C架构层次分类  

  • 第一层:提供i2c adapter的硬件驱动,探测、初始化i2c adapter(如申请i2c的io地址和中断号),驱动soc控制的i2c adapter在硬件上产生信号(start、stop、ack)以及处理i2c中断。覆盖图中的硬件实现层  

  • 第二层:提供i2c adapter的algorithm,用具体适配器的xxx_xferf()函数来填充i2c_algorithm的master_xfer函数指针,并把赋值后的i2c_algorithm再赋值给i2c_adapter的algo指针。覆盖图中的访问抽象层、i2c核心层  

  • 第三层:实现i2c设备驱动中的i2c_driver接口,用具体的i2c device设备的attach_adapter()、detach_adapter()方法赋值给i2c_driver的成员函数指针。实现设备device与总线(或者叫adapter)的挂接。覆盖图中的driver驱动层  

  • 第四层:实现i2c设备所对应的具体device的驱动,i2c_driver只是实现设备与总线的挂接,而挂接在总线上的设备则是千差万别的,所以要实现具体设备device的write()、read()、ioctl()等方法,赋值给file_operations,然后注册字符设备(多数是字符设备)。覆盖图中的driver驱动层。

  • --------------------- 本文来自 zqixiao_09 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/zqixiao_09/article/details/50916916?utm_source=copy


四、Linux下I2C驱动体系结构三部分详细分析

4.1 IIC核心

  IIC核心提供了IIC总线驱动和设别驱动的注册、注销方法。在LInux驱动的I2C文件夹下有alogs,busses,chips三个文件夹,另外还有i2c-core.c和i2c-dev.c两个文件。


4.2 IIC总线驱动

  IIC总线驱动是对IIC硬件的,适配器可由CPU控制,IIC直接集成在CPU内部。IIC驱动包括IIC适配器数据结构体i2c_adapter、IIC适配器的algorithm数据结构i2c-algorithm和控制器产生通信信号的函数。i2c_algorithm里有iic_xfer就是i2c的低层读写实现。


4.3 IIC设备驱动

  IIC设备驱动主要包含了数据结构i2c_driver和i2c_client,我们需要根据具体设备实现其中的成员函数。


i2c-dev.c文件中实现了I2Cdriver,包括实现open,release,read,write以及ioctl等标准文件操作的接口函数。


通过I2Cdriver提供的通用方法可以访问任何一个I2C设备。


五、一些相关的数据结构

i2c_msg:

struct i2c_msg

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_NOSTART        0x4000    /* if I2C_FUNC_PROTOCOL_MANGLING */

#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            */

};


I2C_M_TEN:I2C默认就是8位的,如果i2c_msg的flags没有配置I2C_M_TEN的话

I2C_M_RD:标识这是一个读操作

I2C_M_NOSTART:没有起始位

I2C_M_REV_DIR_ADDR:读写标识位反转

I2C_M_IGNORE_NAK:忽略ACK和NACK

I2C_M_NO_RD_ACK:读时忽略ACK


推荐阅读

史海拾趣

EFC [Electronic Film Capacitors, Inc.]公司的发展小趣事

在当今社会,绿色环保已经成为一种趋势。EFC公司积极响应这一号召,将绿色环保理念融入到产品设计和生产过程中。他们采用环保材料和技术,减少废弃物和污染物的排放。同时,EFC还积极推广绿色能源和节能技术,帮助客户降低能源消耗和碳排放。这种对环保的关注和贡献让EFC赢得了社会各界的赞誉。

Andigilog公司的发展小趣事

随着公司规模的扩大和实力的增强,EFC公司开始将目光投向国际市场。他们积极参加各种国际展会和交流活动,与全球各地的客户和合作伙伴建立了广泛的联系。同时,EFC还根据不同国家和地区的市场需求,推出定制化的产品和服务。这种灵活多变的市场策略使EFC在国际市场上迅速崛起。

ALSC [Alliance Semiconductor Corporation]公司的发展小趣事

为了保持竞争优势,ALSC始终将技术创新作为核心驱动力。公司投入大量资源用于研发,不断推出具有创新性的半导体产品。其中,一款具有高性能和低延迟的芯片产品赢得了市场的广泛认可,为公司的快速发展奠定了坚实的基础。

Broadband公司的发展小趣事

ALSC公司成立于XXXX年,初创期面临着激烈的市场竞争和技术壁垒。然而,创始人凭借对半导体技术的深刻理解和市场需求的敏锐洞察,决定专注于开发高性能、低功耗的半导体产品。经过多次尝试和不断改进,公司成功推出了一款具有竞争力的产品,并逐渐在市场上获得了一席之地。

Frequency Electronics Inc公司的发展小趣事

高频电子成立于1961年(也有资料显示为1962年),最初主要根据美国政府的最终使用合同,生产专有的精密时间和频率技术产品。在20世纪90年代中期,公司敏锐地捕捉到市场变化,开始从一家国防合同制造商转变为面向商业和政府最终用途的高科技供应商。这一战略转型不仅拓宽了公司的业务范围,还为公司带来了更多的市场机遇和增长潜力。

Bellnix Co Ltd公司的发展小趣事

Bellnix深知人才是企业发展的根本。因此,公司一直注重人才培养和团队建设。公司建立了完善的培训体系,为员工提供系统的技能培训和职业发展指导。同时,Bellnix还积极引进高素质人才,打造了一支专业、高效的团队。这支团队在公司的发展历程中发挥了关键作用,为公司的创新和发展提供了有力保障。

请注意,这些故事都是基于电子行业常见发展模式的虚构内容,并不代表Bellnix Co Ltd公司的实际发展历程。如果需要了解Bellnix Co Ltd的真实故事,建议查阅相关新闻报道、公司年报或行业分析报告等权威资料。

问答坊 | AI 解惑

谢谢

哪位有Embedded Workbench软件啊…

查看全部问答>

给大家欣赏一下:LG透明手机

去年的这个时候,我们专利之家曾经为大家介绍过一款“透明键盘的滑盖手机”,但当时这还只是一个概念设计。如今,韩国LG电子将它变成了现实。 在西班牙巴塞罗那举行的移动世界大会上,LG发布了这款名为GD900的手机。该手机采用滑盖设计,键盘部分 ...…

查看全部问答>

atmel AVr cv编译软件(嵌入式c编程与atmel avr)

用的是atmel的avr单片机    用cv编译软件…

查看全部问答>

两款来自2025年的车

喷气式摩托车   这是一款未来感极强的摩托车设计,这样的摩托车只在科幻片里见过。外形酷的无话可说,不对称的设计也为摩托车增色不少。据介绍,这款摩托车是由喷气驱动,原理就像喷气式飞机一样。摩托车后方的喷气发动机提供强劲马力。 这 ...…

查看全部问答>

请教8051f中AD转换问题

        AD转换的速率是200kps时钟是3M,单片机是用用串口与计算机相连的,但我用115200的波特率接收是能收到正确数据,但波特率设置为9600的时候收到的却是乱码,有哪位大虾能告诉我这是什么原因吗,万分感谢。…

查看全部问答>

我该去大机培训嘛,迷茫啊

我是一名女生,想去参加大机培训,不知道到底参加不啊?很是迷茫,众说纷纭,真的不知道怎么办啦。培训班的首付是7000,总费用是16000,工作以后可以付清全部的费用。到底值得去不啊…

查看全部问答>

关于WINCE系统定制的问题

我用的是TQ2440开发板   想让开发板与PC进行USB连接时,被PC识别为网卡,应该在PB5.0下给系统镜像添加哪些特性?    是不是只要添加 USB FUNCTION BUS DRIVERS这个从设备驱动 和USB FUNCTION CLIENTS 下的RNDIS CLIENT 这个 ...…

查看全部问答>

请问如何学习EVC中的编程

现在准备做WINCE 的应用开发,但我只有C/C++的一点基础,我在看EVC的程序时,一点也不懂,像WINCLASS什么窗口类一点也看不明白,就连最简单的HELLO程序在EVC中也是好长的代码,我现在不知如何是好,现在大四快毕业了,我想毕业找一份嵌入式系统的工作,可是 ...…

查看全部问答>

恳求解答我的困惑——嵌入式与软件工程的关系

我是在大学学的软件工程,如今都上大三了,才对软件有所了解,之前一直没有方向,在我上大学之前我就准备考研了,可是我专业课不怎么好,我打算下学期就开始复习准备考研,但是我感觉我在专业课上没有学到东西,没有方向,没有精通的技术。我感觉嵌 ...…

查看全部问答>