focal的5406+mini6410的android2.3.4

2012  3月7日                星期三昨天调通了focal的5406+mini6410的android2.3.4 将focal的驱动文件晒一下。顺便将驱动加载过程以及需要改变的系统文件配置,记录如下。///////////////////////////////////////////////////////////////第一步////////////////////
摘要由CSDN通过智能技术生成

2012  3月7日                星期三
昨天调通了focal的5406+mini6410的android2.3.4 将focal的驱动文件晒一下。顺便将驱动加载过程以及需要改变的系统文件配置,记录如下。
///第一步//
第一步, 创建和配置I2C 设备,将其配置为平台设备并登记在内核。
修改\arch\arm\mach-s3c64xx\mach-mini6410.c文件
添加
/* I2C touch screen devices. */
/* bus configuration */
static struct s3c2410_platform_i2c  i2c_touchscreen_cfg __initdata = {
   .flags        = 0,
    .slave_addr    = 0x38,
   .frequency    = 100*1000,
    .sda_delay    = 2,
};    //应该是IIC设备的私有数据,在这里定义了5406的地址,不知道为什么是0x38(之前一直是0x70),比较晕,这个结构是用来填充i2c平台设备结构体的,下面会说
/* i2c device name is "i2c_ts", address is 0x5c, interrupt is eint20 */
static struct i2c_board_info touchscreen_i2c_devs[] __initdata  = {
    {
        I2C_BOARD_INFO("ft5x0x_ts", 0x38),
        .irq    = IRQ_EINT(6),
    },
};//此结构是代替I2C设备的板级注册,(不理解)

以及在static void __init mini6410_machine_init(void)函数中添加
/* i2c touch screen devices */
 s3c_i2c0_set_platdata(&i2c_touchscreen_cfg);//此函数作用是将i2c_touchscreen_cfg填充为平台适配器的私有数据
i2c_register_board_info(0,touchscreen_i2c_devs, ARRAY_SIZE(touchscreen_i2c_devs));//这个函数注册static struct i2c_board_info结构 
此处 I2C_BOARD_INFO("ft5x0x_ts", 0x38), "ft5x0x_ts" 要和i2c设备驱动中i2c_ts_id一致。才能保证i2c设备驱动成功加载。
还要在文件中包含#include <linux/slab.h>这个头文件

///
其中void __init s3c_i2c0_set_platdata(struct s3c2410_platform_i2c *pd)

{

struct s3c2410_platform_i2c *npd;

if (!pd)

pd = /*默认0控制器的平台参数*/

npd = kmemdup(pd, sizeof(struct s3c2410_platform_i2c), GFP_KERNEL); /*此函数的作用是分配内存大小为sizeof(struct s3c2410_platform_i2c)并复制pd数据到新分配内存区域*/

if (!npd)

printk(KERN_ERR "%s: no memory for platform data\n", __func__);

else if (!npd-cfg_gpio)

npd-cfg_gpio = s3c_i2c0_cfg_gpio; /*I/O口配置函数*/

s3c_device_i2c0.dev.platform_data = npd; //s3c_device_i2c0为平台设备结构,描述i2c设备的

}

//5406设备被定义为平台设备
struct platform_device s3c_device_i2c0 = {
 .name    = "s3c2410-i2c",
#ifdef CONFIG_S3C_DEV_I2C1
 .id    = 0,
#else
 .id    = -1,
#endif
 .num_resources   = ARRAY_SIZE(s3c_i2c_resource),
 .resource   = s3c_i2c_resource,
};
此函数挖坟结束

///
//接着挖下一个函数
//这个函数注册static struct i2c_board_info结构

int __init  i2c_register_board_info(int busnum, struct i2c_board_info const *info, unsigned len)

{

int status;

down_write( /*获取板级锁*/

/* dynamic bus numbers will be assigned after the last static one */

if (busnum = __i2c_first_dynamic_bus_num)

__i2c_first_dynamic_bus_num = busnum + 1;

for (status = 0; len; len--, info++) {

struct i2c_devinfo *devinfo;

devinfo = kzalloc(sizeof(*devinfo), GFP_KERNEL);

if (!devinfo) {

pr_debug("i2c-core: can't register boardinfo!\n");

status = -ENOMEM;

break;

}

devinfo-busnum = busnum; /*总线号*/

devinfo-board_info = *info;

list_add_tail(&devinfo-list, /*加到__i2c_board_list 此**链表中,以后对I2C设备注册可以遍历此链表获得板级相关的I2c设备

*/

}

up_write(

return status;

}
//意思不清楚,这个函数加载后会自动调用下面的函数,这个探测函数正好用到了刚刚s3_i2c0_set_platdata()函数中赋值的私有数据结构体
static int s3c24xx_i2c_probe(struct platform_device *pdev)
{
struct s3c24xx_i2c *i2c; /*基于244XX系类的结构体,不过应该兼容6410*/

struct s3c2410_platform_i2c *pdata;

struct resource *res;

int ret;

pdata = pdev-dev.platform_data; /*获得总线平台相关数据,此和*s3_i2c0_set_platdata()函数调用相对应

*/

if (!pdata) {

dev_err(&pdev-dev, "no platform data\n");

return -EINVAL;

}

i2c = kzalloc(sizeof(struct s3c24xx_i2c), GFP_KERNEL);

if (!i2c) {

dev_err(&pdev-dev, "no memory for state\n");

return -ENOMEM;

}

/挖坟结束///

 

第二步//
第二步Ft5x06_ts.c
此文件为focal给的驱动文件,专门针对android23的,所以未作任何修改,拉出来分析一下。

.1首先是加载函数,以及一些权限和作者的声明,没什么好说的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值