리눅스 디바이스 드라이버의 call back 함수의 매개변수는 어떻게 결정되냐요?
글쓴이: rlatjrdnjs / 작성시간: 금, 2016/11/18 - 10:10오후
hardkernel의 odroid xu3의 커널 코드를 분석하고 있습니다.
ina231이라는 sensor의 디바이스 드라이버 코드를 보고있는데 궁금한점이 있어 질문드립니다.
static int ina231_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) { int rc = 0; struct ina231_sensor *sensor; if(!(sensor = devm_kzalloc(&client->dev, sizeof(struct ina231_sensor), GFP_KERNEL))) { dev_err(&client->dev, "INA231 Sensor struct malloc error!\n"); return -ENOMEM; } // mutex init mutex_init(&sensor->mutex); sensor->client = client; if (client->dev.of_node) { if(ina231_i2c_dt_parse(client, sensor) < 0) goto out; } else { sensor->pd = client->dev.platform_data; } i2c_set_clientdata(client, sensor); // Calculate current lsb value sensor->cur_lsb_uA = sensor->pd->max_A * 1000000 / 32768; // Calculate register value sensor->reg_calibration = 5120000 / (sensor->cur_lsb_uA * sensor->pd->shunt_R_mohm); if((rc = ina231_i2c_write(sensor->client, REG_CONFIG, sensor->pd->config)) < 0) goto out; if((rc = ina231_i2c_write(sensor->client, REG_CALIBRATION, sensor->reg_calibration)) < 0) goto out; if((rc = ina231_i2c_write(sensor->client, REG_ALERT_EN, 0x0000)) < 0) goto out; if((rc = ina231_i2c_write(sensor->client, REG_ALERT_LIMIT, 0x0000)) < 0) goto out; if((rc = ina231_i2c_read(sensor->client, REG_CONFIG )) != sensor->pd->config ) goto out; if((rc = ina231_i2c_read(sensor->client, REG_CALIBRATION )) != sensor->reg_calibration ) goto out; if((rc = ina231_i2c_read(sensor->client, REG_ALERT_EN )) != 0x0000) goto out; if((rc = ina231_i2c_read(sensor->client, REG_ALERT_LIMIT )) != 0x0000) goto out; // misc driver probe if(ina231_misc_probe(sensor) < 0) goto out; // sysfs probe if(ina231_sysfs_create(&client->dev) < 0) goto out; // timer run for sensor data receive INIT_WORK(&sensor->work, ina231_work); if((sensor->wq = create_singlethread_workqueue("ina231_wq")) == NULL) goto out; hrtimer_init(&sensor->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); sensor->timer_sec = sensor->pd->update_period / 1000000; sensor->timer_nsec = sensor->pd->update_period % 1000000; sensor->timer_nsec = sensor->timer_nsec * 1000; sensor->timer.function = ina231_timer; if(sensor->pd->enable) ina231_i2c_enable(sensor); // display register message rc = 0; dev_info(&client->dev, "============= Probe INA231 : %s ============= \n", sensor->pd->name); dev_info(&client->dev, "SENSOR ENABLE : %s\n" , sensor->pd->enable ? "true" : "false"); dev_info(&client->dev, "REG CONFIG : 0x%04X\n" , sensor->pd->config ); dev_info(&client->dev, "REG CALIBRATION : 0x%04X\n" , sensor->reg_calibration ); dev_info(&client->dev, "SHUNT Resister : %d mOhm\n", sensor->pd->shunt_R_mohm ); dev_info(&client->dev, "MAX Current : %d A\n" , sensor->pd->max_A ); dev_info(&client->dev, "Current LSB uA : %d uA\n" , sensor->cur_lsb_uA ); dev_info(&client->dev, "Conversion Time : %d us\n" , sensor->pd->update_period ); dev_info(&client->dev, "=====================================================\n"); return 0; out: dev_err(&client->dev, "============= Probe INA231 Fail! : %s (0x%04X) ============= \n", sensor->pd->name, rc); return rc; }
static struct i2c_driver ina231_i2c_driver = { .driver = { .name = INA231_I2C_NAME, .owner = THIS_MODULE, }, .probe = ina231_i2c_probe, .remove = ina231_i2c_remove, .suspend = ina231_i2c_suspend, .resume = ina231_i2c_resume, .id_table = ina231_id, };
이와같이 i2c_driver 구조체의 probe 에 연결돼있습니다.
공부를 하여 probe는 binding 될 때 callback 해준다는 것 까지는 알았는데 이 함수가 call될때 매개변수로 어떤 값을 갖는지 도저히 찾을 수 없어 질문드립니다.
고수분들의 답변 부탁드립니다.
Forums:
댓글 달기