[fprint] [PATCH] imgdev: add support for FP_IMGDRV_NEEDS_REACTIVATION_BETWEEN_ENROLLS flag

Vasily Khoruzhick anarsoul at gmail.com
Fri Feb 16 21:14:08 UTC 2018


On Fri, Feb 16, 2018 at 12:14 PM, Marco Trevisan (Treviño)
<mail at 3v1n0.net> wrote:
> Vasily,
>
> See https://github.com/3v1n0/libfprint/commit/8cb5e6945cc26 (and
> related code) in this device after every enroll stage (and after every
> image save) we need to perform the device reactivation...

That sounds like an issue with the driver, not with the library.

> Now, during enroll it's libfprint itself that keeps track of the
> number of stages that have been performed, and after every stage has
> been completed the driver isn't informed about reactivating the device
> (the only thing that changes is that the state is set to
> AWAITING_FINGER). Thus nothing would happen in this sensor for
> example.
>
> Reactivation is something that should be triggered at higher level
> than the driver itself, imho. As it's something that is supposed to
> happen all the other cases when using all the libfprint based tools or
> examples (fprintd is a different thing here).

No, it shouldn't. Deactivation may put scanner into low power mode,
and I don't see serious reasons to call "deactivate" between
enrollment steps. If driver needs to do something before capturing
next image - move it to the end of image capturing SSM.

> 2018-02-16 20:07 GMT+01:00 Vasily Khoruzhick <anarsoul at gmail.com>:
>> On Thu, Feb 15, 2018 at 5:56 PM, Marco Trevisan (Treviño)
>> <mail at 3v1n0.net> wrote:
>>> When a device has this flag set, it has to be re-activated at
>>> each enroll step, without performing any other cleanup.
>>>
>>> This allows to solve this such case in a cleaner way inside
>>> drivers.
>>
>> What's the purpose of this change?
>>
>>> ---
>>>  libfprint/fp_internal.h |  1 +
>>>  libfprint/imgdev.c      | 30 +++++++++++++++++++++++++++---
>>>  2 files changed, 28 insertions(+), 3 deletions(-)
>>>
>>> diff --git a/libfprint/fp_internal.h b/libfprint/fp_internal.h
>>> index 74c5f7f..ea46b1e 100644
>>> --- a/libfprint/fp_internal.h
>>> +++ b/libfprint/fp_internal.h
>>> @@ -232,6 +232,7 @@ enum fp_print_data_type
>>> fpi_driver_get_data_type(struct fp_driver *drv);
>>>   /* flags for fp_img_driver.flags */
>>>  #define FP_IMGDRV_SUPPORTS_UNCONDITIONAL_CAPTURE (1 << 0)
>>> +#define FP_IMGDRV_NEEDS_REACTIVATION_BETWEEN_ENROLLS (1 << 1)
>>>   struct fp_img_driver {
>>>         struct fp_driver driver;
>>> diff --git a/libfprint/imgdev.c b/libfprint/imgdev.c
>>> index 4408c23..20a1559 100644
>>> --- a/libfprint/imgdev.c
>>> +++ b/libfprint/imgdev.c
>>> @@ -27,6 +27,9 @@
>>>  #define BOZORTH3_DEFAULT_THRESHOLD 40
>>>  #define IMG_ENROLL_STAGES 5
>>>  +static int dev_activate(struct fp_img_dev *imgdev, enum
>>> fp_imgdev_state state);
>>> +static void dev_deactivate(struct fp_img_dev *imgdev);
>>> +
>>>  static int img_dev_open(struct fp_dev *dev, unsigned long driver_data)
>>>  {
>>>         struct fp_img_dev *imgdev = g_malloc0(sizeof(*imgdev));
>>> @@ -124,6 +127,7 @@ void fpi_imgdev_report_finger_status(struct
>>> fp_img_dev *imgdev,
>>>         int r = imgdev->action_result;
>>>         struct fp_print_data *data = imgdev->acquire_data;
>>>         struct fp_img *img = imgdev->acquire_img;
>>> +       struct fp_img_driver *imgdrv = fpi_driver_to_img_driver(imgdev->dev->drv);
>>>         fp_dbg(present ? "finger on sensor" : "finger removed");
>>>  @@ -158,8 +162,14 @@ void fpi_imgdev_report_finger_status(struct
>>> fp_img_dev *imgdev,
>>>                 if (imgdev->action == IMG_ACTION_ENROLL &&
>>>                     r > 0 && r != FP_ENROLL_COMPLETE && r != FP_ENROLL_FAIL) {
>>>                         imgdev->action_result = 0;
>>> -                       imgdev->action_state = IMG_ACQUIRE_STATE_AWAIT_FINGER_ON;
>>> -                       dev_change_state(imgdev, IMGDEV_STATE_AWAIT_FINGER_ON);
>>> +
>>> +                       if (imgdrv->flags & FP_IMGDRV_NEEDS_REACTIVATION_BETWEEN_ENROLLS) {
>>> +                               imgdev->action_state = IMG_ACQUIRE_STATE_DEACTIVATING;
>>> +                               dev_deactivate(imgdev);
>>> +                       } else {
>>> +                               imgdev->action_state = IMG_ACQUIRE_STATE_AWAIT_FINGER_ON;
>>> +                               dev_change_state(imgdev, IMGDEV_STATE_AWAIT_FINGER_ON);
>>> +                       }
>>>                 }
>>>                 break;
>>>         case IMG_ACTION_VERIFY:
>>> @@ -332,11 +342,16 @@ void fpi_imgdev_session_error(struct fp_img_dev
>>> *imgdev, int error)
>>>   void fpi_imgdev_activate_complete(struct fp_img_dev *imgdev, int status)
>>>  {
>>> +       struct fp_img_driver *imgdrv = fpi_driver_to_img_driver(imgdev->dev->drv);
>>> +
>>>         fp_dbg("status %d", status);
>>>         switch (imgdev->action) {
>>>         case IMG_ACTION_ENROLL:
>>> -               fpi_drvcb_enroll_started(imgdev->dev, status);
>>> +               if (!(imgdrv->flags & FP_IMGDRV_NEEDS_REACTIVATION_BETWEEN_ENROLLS) ||
>>> +                   imgdev->dev->state != DEV_STATE_ENROLLING) {
>>> +                       fpi_drvcb_enroll_started(imgdev->dev, status);
>>> +               }
>>>                 break;
>>>         case IMG_ACTION_VERIFY:
>>>                 fpi_drvcb_verify_started(imgdev->dev, status);
>>> @@ -360,10 +375,19 @@ void fpi_imgdev_activate_complete(struct
>>> fp_img_dev *imgdev, int status)
>>>   void fpi_imgdev_deactivate_complete(struct fp_img_dev *imgdev)
>>>  {
>>> +       struct fp_img_driver *imgdrv = fpi_driver_to_img_driver(imgdev->dev->drv);
>>> +
>>>         fp_dbg("");
>>>         switch (imgdev->action) {
>>>         case IMG_ACTION_ENROLL:
>>> +               if ((imgdrv->flags & FP_IMGDRV_NEEDS_REACTIVATION_BETWEEN_ENROLLS) &&
>>> +                       imgdev->dev->state == DEV_STATE_ENROLLING) {
>>> +                       imgdev->action_state = IMG_ACQUIRE_STATE_ACTIVATING;
>>> +                       dev_activate(imgdev, IMGDEV_STATE_AWAIT_FINGER_ON);
>>> +                       return;
>>> +               }
>>> +
>>>                 fpi_drvcb_enroll_stopped(imgdev->dev);
>>>                 break;
>>>         case IMG_ACTION_VERIFY:
>>> --
>>> 2.7.4
>>>
>>> _______________________________________________
>>> fprint mailing list
>>> fprint at lists.freedesktop.org
>>> https://lists.freedesktop.org/mailman/listinfo/fprint
>
>
>
> --
> Treviño's World - Life and Linux
> http://www.3v1n0.net


More information about the fprint mailing list