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首先是加载函数,以及一些权限和作者的声明,没什么好说的