[Q] Proximity Sensor Calibration

Search This thread

CrazyEngineer

New member
Dec 13, 2012
1
0
I found out that the proximity sensor on my Note II isn't working as it should. Whenever I am on call, the screen goes off, but doesn't lit up when I move the phone away from my ear. I've investigated and found that calibrating the proximity sensor could solve the problem.

I've searched around but haven't found the right steps to calibrate the proximity sensor on Note 2. The 'Phone Tester' app shows weird behavior of the sensor. It sometimes just keeps waiting for the data and sometimes shows 'Far' , 'Near' status correctly. But once I move my hand near the sensor and then move it away, the status remains 'Near'.

I'd really appreciate recalibration procedure & any other recommended fix.
 

abdo9119

Member
Jan 15, 2013
46
2
I found out that the proximity sensor on my Note II isn't working as it should. Whenever I am on call, the screen goes off, but doesn't lit up when I move the phone away from my ear. I've investigated and found that calibrating the proximity sensor could solve the problem.

I've searched around but haven't found the right steps to calibrate the proximity sensor on Note 2. The 'Phone Tester' app shows weird behavior of the sensor. It sometimes just keeps waiting for the data and sometimes shows 'Far' , 'Near' status correctly. But once I move my hand near the sensor and then move it away, the status remains 'Near'.

I'd really appreciate recalibration procedure & any other recommended fix.

I think from check list call *#0*#:laugh:
 

bushako

Senior Member
Mar 16, 2007
1,359
327
Dubai
To calibrate the proximity sensor you need to edit the build.prop, file. Quickest way I do this is by using Romtoolbox pro which has that option. Once in the build prop up editor you'll see the option to recalibrate the proximity sensor. You'll need root access.

Sent from the Rabbit Hole
 

rumy

Senior Member
Apr 22, 2006
215
11
Toronto
To calibrate the proximity sensor you need to edit the build.prop, file. Quickest way I do this is by using Romtoolbox pro which has that option. Once in the build prop up editor you'll see the option to recalibrate the proximity sensor. You'll need root access.

Sent from the Rabbit Hole

Where exactly in the build.prop is this setting. I access it using root explorer and scanned through the entire file and saw nothing that would hint at the proximity sensor calibration.
 

bushako

Senior Member
Mar 16, 2007
1,359
327
Dubai
Where exactly in the build.prop is this setting. I access it using root explorer and scanned through the entire file and saw nothing that would hint at the proximity sensor calibration.



Sent from the Rabbit Hole
 

Attachments

  • uploadfromtaptalk1359784714576.jpg
    uploadfromtaptalk1359784714576.jpg
    42.2 KB · Views: 6,920

rumy

Senior Member
Apr 22, 2006
215
11
Toronto
Sent from the Rabbit Hole

I don't have that in my build.prop I am running ARHD9.0

What exactly does that do. Does it just delay the screen from going of when on your face? In that case I have already disabled the proximity sensor during calls.

I am starting to wonder if this is a hardware fault.
 

yushir0

New member
Feb 25, 2013
3
2
It looks like the proximity threshold is set too low in the kernel and causes this to misbehave when the sensor gets a little dirty.

For example: If you open the diagnostic menu by dialing *#0*# and look under sensors if your ADC value for the sensor is anything over 12, the proximity sensor will register that something is close to the phone. That value can be temporarily adjusted by setting prox_thresh under /sys/devices/virtual/sensors/proximity_sensor to something higher (like 30).

Unfortunately, it looks like changing this value doesn't "stick" and the next time the sensor is accessed, something changes it back to the default of 12.

I'm guessing that the default value is set in the kernel at compile time. Maybe someone can talk of the kernel devs into tweaking the value.
 
Last edited:
  • Like
Reactions: Formhault

icbraz

Member
Apr 15, 2013
5
0
anyone found a solution to this yet?

Hi, is rooting the phone the only way to get this working? So annoying... Maybe will just send this galaxy note 2 back for a refund, tried for a long time to get this fixed, I think it started after the last android update I thought they'd have done something about it by now...
 

greaty

New member
May 8, 2012
2
35
On Samsung devices like i9100 (Galaxy S3) or N7100 (Note II) you can do the following if you have root permissions:

On Android Terminal App or adb shell do:
Code:
$ su
$ echo 0 > /sys/class/sensors/proximity_sensor/prox_cal
$ echo 1 > /sys/class/sensors/proximity_sensor/prox_cal

The zero resets the actual calibration offset.
The one does an auto calibration (read sensor value, set offset to this sensor value, write calibration offset to "/efs/prox_cal" which is read while device is booting).
Best for calibrate your sensor is to keep it dark, the glass have to be clean and the sensor free (so that the sensor doesn't measure anything).
The calibration offset is stored in efs, thats why you can make full wipe and use other ROMs without the need of recalibration.

You can check the running config by:
Code:
$ cat /sys/class/sensors/proximity_sensor/state
The first value is the calibration Offset, the second one is the sensor threshold (threshold is set at compile time).

Open *#0*# to see "sensors" and check if your proximity sensor is now working properly.


Because in Kernel code (copyright by Samsung) for the device driver is somthing like this autocalibration, i bet that there is a secret menue or code that does the calibration too. But until someone discovers this secret we have to have root permissions to do a proximity sensor calibration.
 

marcmy

Member
Mar 28, 2011
29
7
On Samsung devices like i9100 (Galaxy S3) or N7100 (Note II) you can do the following if you have root permissions:

On Android Terminal App or adb shell do:
Code:
$ su
$ echo 0 > /sys/class/sensors/proximity_sensor/prox_cal
$ echo 1 > /sys/class/sensors/proximity_sensor/prox_cal

The zero resets the actual calibration offset.
The one does an auto calibration (read sensor value, set offset to this sensor value, write calibration offset to "/efs/prox_cal" which is read while device is booting).
Best for calibrate your sensor is to keep it dark, the glass have to be clean and the sensor free (so that the sensor doesn't measure anything).
The calibration offset is stored in efs, thats why you can make full wipe and use other ROMs without the need of recalibration.

You can check the running config by:
Code:
$ cat /sys/class/sensors/proximity_sensor/state
The first value is the calibration Offset, the second one is the sensor threshold (threshold is set at compile time).

Open *#0*# to see "sensors" and check if your proximity sensor is now working properly.


Because in Kernel code (copyright by Samsung) for the device driver is somthing like this autocalibration, i bet that there is a secret menue or code that does the calibration too. But until someone discovers this secret we have to have root permissions to do a proximity sensor calibration.

Hey, I've been looking for a fix for prox sensor on my Note 2 ever since I installed Paranoid back in december/january, went back to stock and it was still broken. This fixed it!! So thank you :) I have just one issue, it seems to go back to being broken when I reboot the phone. Is there any way to prevent this? Also the *#0*# doesn't work for me and the cat command returns just a 0. Thanks.

EDIT: it might help to note that I'm running cyanogenmod 10.1 nightly now
EDIT2: I figured it out! I did a search for prox_cal and found one in /sys/devices/virtual/sensors/proximity_sensor with the values 18,9. i put those values in the empty /efs/prox_cal. It now works on boot. :)
 
Last edited:

greaty

New member
May 8, 2012
2
35
... it seems to go back to being broken when I reboot the phone. Is there any way to prevent this? Also the *#0*# doesn't work for me and the cat command returns just a 0. Thanks.

EDIT: it might help to note that I'm running cyanogenmod 10.1 nightly now
EDIT2: I figured it out! I did a search for prox_cal and found one in /sys/devices/virtual/sensors/proximity_sensor with the values 18,9. i put those values in the empty /efs/prox_cal. It now works on boot. :)

I described the sensor recalibration on Samsung rom or Samsung based roms. " *#0*# "is a "secret code" that starts a samsung test tool - only included in stock or stock rom based.

I have read from other users that "cat state" returns zero. I don't know exactly why. But it could be because:
1. that the sensor is powered down (on my phone the sensor never sleeps)
2. the calibration offset is too high
3. the calibration offset is optimal
To test the sensor is on and working you should read the value with finger put on. (there should be value around 127-calibration offset). I guess to do the calibration/sensor reading with display on and phone unlocked. Another user told me that it helped to start an app which reads the sensor values (so the sensor wake up).

But in your case proximity_sensor with the values 18,9 means that the sensor is already calibrated to 18 which can cause a zero at "cat state".
Note that the offset is read from file calibration file at boot time and from that on holded in ram. The RAM value can only be influenced by "/sys/class/sensors/proximity_sensor/prox_cal" or by calibration file (on boot). The auto calibration process not only try to create a /efs/prox_cal file but also changes the calibration value in ram at run time .
So if you try "echo 0 > /sys/class/sensors/proximity_sensor/prox_cal; echo 1 > /sys/class/sensors/proximity_sensor/prox_cal" -> "mmh auto calibration does not work there is no prox_cal file, i will try it manually" can be the wrong way because the calibration offset can be already changed to a calibrated value and so you wont get the correct blank value read out "state".


The other path in virtual filesystem to the sensor control you mentioned is also correct. I don't know which is the most common one.
But since both pathes are available in samsung stock i guess it should be " /sys/devices/virtual/sensors/proximity_sensor".



Be careful of putting in the calibration value manually. In Samsung stock rom the kernel which is reading the calibration value at boot time don't make a character conversion. So if you write the config file like this:
Code:
echo '18,9' > /efs/prox_cal
Ends Up with Calibration value of 49 because the kernel will read the first byte of file. This is a "1" which is the ASCII code for "0x31" which is 49 in decimal. That should work too but throw away half of the sensor sensivity.


If you would like to calibrate it manually you have to:

Code:
cd /sys/devices/virtual/sensors/proximity_sensor/

Read the blank value ( glass have to be clean and fingers away from sensor ).
Code:
$ cat state #finger on the sensor to test if the sensor is working properly
120
$ cat state #blank value
10

Read the actual configuration:
Code:
$ cat prox_cal
0,9

The first value is the "sensor offset" and the second one is "Cancelation Threshold" (threshold can not stored in calibration file)

So you calculate your calibration value: 0 (actual sensor offset) + 10 (blank value) = 10 (new offset) = 0x0a HEX. Make shure your efs partition is mounted writeable and then:

Code:
$ su
$ echo -en $'\x[B]0a[/B]' > /efs/prox_cal
$ sync

If the prox_cal is created first you should change the permisssions. Kernel sets 666 by default :

Code:
$ chown system:system /efs/prox_cal
$ chmod 644 /efs/prox_cal
$ sync

After reboot you can confirm the calibration

Code:
$ cat /sys/devices/virtual/sensors/proximity_sensor/prox_cal
10,9
$ cat  /sys/devices/virtual/sensors/proximity_sensor/state
0


If you have to calibrate to a lower sensor value and want to do it the "manual way" you have to reset the calibration or delete the calibration file and reboot. because state value = sensor value - offset . And if offset gets to big the state is alway zero.
 

aHcVolle

Senior Member
Nov 3, 2010
433
251
Stuttgart
On Android Terminal App or adb shell do:
Code:
$ su
$ echo 0 > /sys/class/sensors/proximity_sensor/prox_cal
$ echo 1 > /sys/class/sensors/proximity_sensor/prox_cal

The zero resets the actual calibration offset.
The one does an auto calibration (read sensor value, set offset to this sensor value, write calibration offset to "/efs/prox_cal" which is read while device is booting).

working great on my i9505 thanks !!!!
 

adrianjayy

Member
Sep 30, 2009
15
0
Hello, so I had a very similar experience in flashing Paranoid and then my sensor went bezerk. It seems to be just not turning on with the phone, but the front camera does work fine. I was able to get it working a few days ago by flashing the stock rom and kernel multiple times, but I decided to get bold and reflash the Neak kernel and poof, that was over. Not another few flashes would bring my sensor back. At this point I don't even know what to do.

Thought it might also be worthwhile to mention: the light sensor also does not work and when I looked through the files in the sys/class/sensors for both proximity and light sensors the runtime status is unsupported.
 
Last edited:

Skipjacks

Senior Member
Nov 1, 2011
5,416
4,329
Baltimore
A full Odin restore should reset all these values and the whole thing should work right immediately as long as the sensor hardware hasn't gone bad, right?
 

vaghotstuff

Member
Jul 1, 2008
18
4
Easy FIX!!!!!
I took a can of compressed air and blew it through the top earpiece grill a few times and Voila, it works great now!!

I actually used a Old perfume can which perfume was over and it was only pressing Gas OFF!! :p:p :good::good::good::good:
 
  • Like
Reactions: jeromechin

mcelicalderon

New member
Sep 8, 2013
3
10
Finally Fixed My Sensor

I described the sensor recalibration on Samsung rom or Samsung based roms. " *#0*# "is a "secret code" that starts a samsung test tool - only included in stock or stock rom based.

I have read from other users that "cat state" returns zero. I don't know exactly why. But it could be because:
1. that the sensor is powered down (on my phone the sensor never sleeps)
2. the calibration offset is too high
3. the calibration offset is optimal
To test the sensor is on and working you should read the value with finger put on. (there should be value around 127-calibration offset). I guess to do the calibration/sensor reading with display on and phone unlocked. Another user told me that it helped to start an app which reads the sensor values (so the sensor wake up).

But in your case proximity_sensor with the values 18,9 means that the sensor is already calibrated to 18 which can cause a zero at "cat state".
Note that the offset is read from file calibration file at boot time and from that on holded in ram. The RAM value can only be influenced by "/sys/class/sensors/proximity_sensor/prox_cal" or by calibration file (on boot). The auto calibration process not only try to create a /efs/prox_cal file but also changes the calibration value in ram at run time .
So if you try "echo 0 > /sys/class/sensors/proximity_sensor/prox_cal; echo 1 > /sys/class/sensors/proximity_sensor/prox_cal" -> "mmh auto calibration does not work there is no prox_cal file, i will try it manually" can be the wrong way because the calibration offset can be already changed to a calibrated value and so you wont get the correct blank value read out "state".


The other path in virtual filesystem to the sensor control you mentioned is also correct. I don't know which is the most common one.
But since both pathes are available in samsung stock i guess it should be " /sys/devices/virtual/sensors/proximity_sensor".



Be careful of putting in the calibration value manually. In Samsung stock rom the kernel which is reading the calibration value at boot time don't make a character conversion. So if you write the config file like this:
Code:
echo '18,9' > /efs/prox_cal
Ends Up with Calibration value of 49 because the kernel will read the first byte of file. This is a "1" which is the ASCII code for "0x31" which is 49 in decimal. That should work too but throw away half of the sensor sensivity.


If you would like to calibrate it manually you have to:

Code:
cd /sys/devices/virtual/sensors/proximity_sensor/

Read the blank value ( glass have to be clean and fingers away from sensor ).
Code:
$ cat state #finger on the sensor to test if the sensor is working properly
120
$ cat state #blank value
10

Read the actual configuration:
Code:
$ cat prox_cal
0,9

The first value is the "sensor offset" and the second one is "Cancelation Threshold" (threshold can not stored in calibration file)

So you calculate your calibration value: 0 (actual sensor offset) + 10 (blank value) = 10 (new offset) = 0x0a HEX. Make shure your efs partition is mounted writeable and then:

Code:
$ su
$ echo -en $'\x[B]0a[/B]' > /efs/prox_cal
$ sync

If the prox_cal is created first you should change the permisssions. Kernel sets 666 by default :

Code:
$ chown system:system /efs/prox_cal
$ chmod 644 /efs/prox_cal
$ sync

After reboot you can confirm the calibration

Code:
$ cat /sys/devices/virtual/sensors/proximity_sensor/prox_cal
10,9
$ cat  /sys/devices/virtual/sensors/proximity_sensor/state
0


If you have to calibrate to a lower sensor value and want to do it the "manual way" you have to reset the calibration or delete the calibration file and reboot. because state value = sensor value - offset . And if offset gets to big the state is alway zero.

Finally, this fixed my problem. I don't know why, but the other solution worked one time while using a CM 10.2 nightly

Code:
$ su
$ echo 0 > /sys/devices/virtual/sensors/proximity_sensor/prox_cal
$ echo 1 > /sys/devices/virtual/sensors/proximity_sensor/prox_cal

But, when I upgraded to the latest nightly, this stopped working. It wouldn't work even if y restored my stock ROM backup using TWRP, I even flashed a stock image with odin and the sensor would still malfunction.

Today I followed this steps using the values returned for my phone and it finally worked! I did this.

Code:
$ cat state #finger on the sensor to test if the sensor is working properly
120
$ cat state #blank value
10

This returned 255 #finger on the sensor and 69 #blank value

and when I did
Code:
 cat /sys/devices/virtual/sensors/proximity_sensor/prox_cal

this returned 47,60,45.....so my offset was 47. Ths sum of offset and #blank value was 47 + 69 = 116 that is equal to 74 in HEX.

so I did

Code:
$ echo -en $'\x74' > /efs/prox_cal

and then

Code:
$ chown system:system /efs/prox_cal
$ chmod 644 /efs/prox_cal
$ sync

After that I rebooted my phone from the terminal using que command

Code:
$ reboot

and that was it! Now my sensor is fixed and survives reboot. Thanks!
 

Top Liked Posts

  • There are no posts matching your filters.
  • 20
    ... it seems to go back to being broken when I reboot the phone. Is there any way to prevent this? Also the *#0*# doesn't work for me and the cat command returns just a 0. Thanks.

    EDIT: it might help to note that I'm running cyanogenmod 10.1 nightly now
    EDIT2: I figured it out! I did a search for prox_cal and found one in /sys/devices/virtual/sensors/proximity_sensor with the values 18,9. i put those values in the empty /efs/prox_cal. It now works on boot. :)

    I described the sensor recalibration on Samsung rom or Samsung based roms. " *#0*# "is a "secret code" that starts a samsung test tool - only included in stock or stock rom based.

    I have read from other users that "cat state" returns zero. I don't know exactly why. But it could be because:
    1. that the sensor is powered down (on my phone the sensor never sleeps)
    2. the calibration offset is too high
    3. the calibration offset is optimal
    To test the sensor is on and working you should read the value with finger put on. (there should be value around 127-calibration offset). I guess to do the calibration/sensor reading with display on and phone unlocked. Another user told me that it helped to start an app which reads the sensor values (so the sensor wake up).

    But in your case proximity_sensor with the values 18,9 means that the sensor is already calibrated to 18 which can cause a zero at "cat state".
    Note that the offset is read from file calibration file at boot time and from that on holded in ram. The RAM value can only be influenced by "/sys/class/sensors/proximity_sensor/prox_cal" or by calibration file (on boot). The auto calibration process not only try to create a /efs/prox_cal file but also changes the calibration value in ram at run time .
    So if you try "echo 0 > /sys/class/sensors/proximity_sensor/prox_cal; echo 1 > /sys/class/sensors/proximity_sensor/prox_cal" -> "mmh auto calibration does not work there is no prox_cal file, i will try it manually" can be the wrong way because the calibration offset can be already changed to a calibrated value and so you wont get the correct blank value read out "state".


    The other path in virtual filesystem to the sensor control you mentioned is also correct. I don't know which is the most common one.
    But since both pathes are available in samsung stock i guess it should be " /sys/devices/virtual/sensors/proximity_sensor".



    Be careful of putting in the calibration value manually. In Samsung stock rom the kernel which is reading the calibration value at boot time don't make a character conversion. So if you write the config file like this:
    Code:
    echo '18,9' > /efs/prox_cal
    Ends Up with Calibration value of 49 because the kernel will read the first byte of file. This is a "1" which is the ASCII code for "0x31" which is 49 in decimal. That should work too but throw away half of the sensor sensivity.


    If you would like to calibrate it manually you have to:

    Code:
    cd /sys/devices/virtual/sensors/proximity_sensor/

    Read the blank value ( glass have to be clean and fingers away from sensor ).
    Code:
    $ cat state #finger on the sensor to test if the sensor is working properly
    120
    $ cat state #blank value
    10

    Read the actual configuration:
    Code:
    $ cat prox_cal
    0,9

    The first value is the "sensor offset" and the second one is "Cancelation Threshold" (threshold can not stored in calibration file)

    So you calculate your calibration value: 0 (actual sensor offset) + 10 (blank value) = 10 (new offset) = 0x0a HEX. Make shure your efs partition is mounted writeable and then:

    Code:
    $ su
    $ echo -en $'\x[B]0a[/B]' > /efs/prox_cal
    $ sync

    If the prox_cal is created first you should change the permisssions. Kernel sets 666 by default :

    Code:
    $ chown system:system /efs/prox_cal
    $ chmod 644 /efs/prox_cal
    $ sync

    After reboot you can confirm the calibration

    Code:
    $ cat /sys/devices/virtual/sensors/proximity_sensor/prox_cal
    10,9
    $ cat  /sys/devices/virtual/sensors/proximity_sensor/state
    0


    If you have to calibrate to a lower sensor value and want to do it the "manual way" you have to reset the calibration or delete the calibration file and reboot. because state value = sensor value - offset . And if offset gets to big the state is alway zero.
    15
    On Samsung devices like i9100 (Galaxy S3) or N7100 (Note II) you can do the following if you have root permissions:

    On Android Terminal App or adb shell do:
    Code:
    $ su
    $ echo 0 > /sys/class/sensors/proximity_sensor/prox_cal
    $ echo 1 > /sys/class/sensors/proximity_sensor/prox_cal

    The zero resets the actual calibration offset.
    The one does an auto calibration (read sensor value, set offset to this sensor value, write calibration offset to "/efs/prox_cal" which is read while device is booting).
    Best for calibrate your sensor is to keep it dark, the glass have to be clean and the sensor free (so that the sensor doesn't measure anything).
    The calibration offset is stored in efs, thats why you can make full wipe and use other ROMs without the need of recalibration.

    You can check the running config by:
    Code:
    $ cat /sys/class/sensors/proximity_sensor/state
    The first value is the calibration Offset, the second one is the sensor threshold (threshold is set at compile time).

    Open *#0*# to see "sensors" and check if your proximity sensor is now working properly.


    Because in Kernel code (copyright by Samsung) for the device driver is somthing like this autocalibration, i bet that there is a secret menue or code that does the calibration too. But until someone discovers this secret we have to have root permissions to do a proximity sensor calibration.
    12
    FIXED. Thanks to mcelicalderon, Finally Fixed

    Methods that worked for me.
    Method 1.
    Blow Air it will solve your prob hopefully.

    Method 2.
    go to samsung code *#0*#. then SENSORS and Read your Proximity sensor values.

    <<< DECISION >>>>>
    ####Calibration isnot needed if ####
    .
    your phone doesnt vibrate in normal but does so when u physically put your finger on the Sensor.

    #### Calibration needed if ####
    .
    your phone is vibrating in this menu no matter what, you put your finger on the sensor or not
    Follow these steps
    1. download Android Terminal from store
    2. type these commands to calibrate automatically
    $ su
    # echo 0 > /sys/devices/virtual/sensors/proximity_sensor/prox_cal
    # echo 1 > /sys/devices/virtual/sensors/proximity_sensor/prox_cal

    Reboot and see if it works.go to *#0*# and check if it continuously vibrating or only does so when you put your finger on the SENSOR.

    <<<< IF Continuously Vibrating Follow these steps>>>>

    you need to manually put values in ur /efs/prox_cal.it Reads Hexadecimal value. so you have to convert your decimal values into HEX.

    ##### FIND YOUR Decimal Values and pushing them into /efs/prox_cal ######

    Method : finding two values for calibration . offset + normal value.
    ##.. FINDING OFFSET ######
    cat /sys/devices/virtual/sensors/proximity_sensor/prox_cal

    note down the values it returns.. mine is 5,64,100.. you only need the 1st value which is 5.
    ### FINDING NORMAL STATE ######

    cat /sys/devices/virtual/sensors/proximity_sensor/state
    note down the value if returns. mine is 64

    now ADD OFFSET value + Normal Value
    5 + 64 = 69
    Convert in Hexadecimal which is 45.

    <<<<<<<<<<< Pushing the value in /efs/prox_cal >>>>>>>>>>>>>>

    # echo -en $ '\x45' > /efs/prox_cal

    then
    # chown system:system /efs/prox_cal
    # chmod 644 /efs/prox_cal
    # sync
    # Reboot

    All done. after that go to *#0*# then SENSORS and move your finger on the sensor, yout phone will Vibrate only when you put your finger on the sensors.

    Manual method worked for me.
    ENJOY.
    9
    Finally Fixed My Sensor

    I described the sensor recalibration on Samsung rom or Samsung based roms. " *#0*# "is a "secret code" that starts a samsung test tool - only included in stock or stock rom based.

    I have read from other users that "cat state" returns zero. I don't know exactly why. But it could be because:
    1. that the sensor is powered down (on my phone the sensor never sleeps)
    2. the calibration offset is too high
    3. the calibration offset is optimal
    To test the sensor is on and working you should read the value with finger put on. (there should be value around 127-calibration offset). I guess to do the calibration/sensor reading with display on and phone unlocked. Another user told me that it helped to start an app which reads the sensor values (so the sensor wake up).

    But in your case proximity_sensor with the values 18,9 means that the sensor is already calibrated to 18 which can cause a zero at "cat state".
    Note that the offset is read from file calibration file at boot time and from that on holded in ram. The RAM value can only be influenced by "/sys/class/sensors/proximity_sensor/prox_cal" or by calibration file (on boot). The auto calibration process not only try to create a /efs/prox_cal file but also changes the calibration value in ram at run time .
    So if you try "echo 0 > /sys/class/sensors/proximity_sensor/prox_cal; echo 1 > /sys/class/sensors/proximity_sensor/prox_cal" -> "mmh auto calibration does not work there is no prox_cal file, i will try it manually" can be the wrong way because the calibration offset can be already changed to a calibrated value and so you wont get the correct blank value read out "state".


    The other path in virtual filesystem to the sensor control you mentioned is also correct. I don't know which is the most common one.
    But since both pathes are available in samsung stock i guess it should be " /sys/devices/virtual/sensors/proximity_sensor".



    Be careful of putting in the calibration value manually. In Samsung stock rom the kernel which is reading the calibration value at boot time don't make a character conversion. So if you write the config file like this:
    Code:
    echo '18,9' > /efs/prox_cal
    Ends Up with Calibration value of 49 because the kernel will read the first byte of file. This is a "1" which is the ASCII code for "0x31" which is 49 in decimal. That should work too but throw away half of the sensor sensivity.


    If you would like to calibrate it manually you have to:

    Code:
    cd /sys/devices/virtual/sensors/proximity_sensor/

    Read the blank value ( glass have to be clean and fingers away from sensor ).
    Code:
    $ cat state #finger on the sensor to test if the sensor is working properly
    120
    $ cat state #blank value
    10

    Read the actual configuration:
    Code:
    $ cat prox_cal
    0,9

    The first value is the "sensor offset" and the second one is "Cancelation Threshold" (threshold can not stored in calibration file)

    So you calculate your calibration value: 0 (actual sensor offset) + 10 (blank value) = 10 (new offset) = 0x0a HEX. Make shure your efs partition is mounted writeable and then:

    Code:
    $ su
    $ echo -en $'\x[B]0a[/B]' > /efs/prox_cal
    $ sync

    If the prox_cal is created first you should change the permisssions. Kernel sets 666 by default :

    Code:
    $ chown system:system /efs/prox_cal
    $ chmod 644 /efs/prox_cal
    $ sync

    After reboot you can confirm the calibration

    Code:
    $ cat /sys/devices/virtual/sensors/proximity_sensor/prox_cal
    10,9
    $ cat  /sys/devices/virtual/sensors/proximity_sensor/state
    0


    If you have to calibrate to a lower sensor value and want to do it the "manual way" you have to reset the calibration or delete the calibration file and reboot. because state value = sensor value - offset . And if offset gets to big the state is alway zero.

    Finally, this fixed my problem. I don't know why, but the other solution worked one time while using a CM 10.2 nightly

    Code:
    $ su
    $ echo 0 > /sys/devices/virtual/sensors/proximity_sensor/prox_cal
    $ echo 1 > /sys/devices/virtual/sensors/proximity_sensor/prox_cal

    But, when I upgraded to the latest nightly, this stopped working. It wouldn't work even if y restored my stock ROM backup using TWRP, I even flashed a stock image with odin and the sensor would still malfunction.

    Today I followed this steps using the values returned for my phone and it finally worked! I did this.

    Code:
    $ cat state #finger on the sensor to test if the sensor is working properly
    120
    $ cat state #blank value
    10

    This returned 255 #finger on the sensor and 69 #blank value

    and when I did
    Code:
     cat /sys/devices/virtual/sensors/proximity_sensor/prox_cal

    this returned 47,60,45.....so my offset was 47. Ths sum of offset and #blank value was 47 + 69 = 116 that is equal to 74 in HEX.

    so I did

    Code:
    $ echo -en $'\x74' > /efs/prox_cal

    and then

    Code:
    $ chown system:system /efs/prox_cal
    $ chmod 644 /efs/prox_cal
    $ sync

    After that I rebooted my phone from the terminal using que command

    Code:
    $ reboot

    and that was it! Now my sensor is fixed and survives reboot. Thanks!
    2
    On Samsung devices like i9100 (Galaxy S3) or N7100 (Note II) you can do the following if you have root permissions:

    On Android Terminal App or adb shell do:
    Code:
    $ su
    $ echo 0 > /sys/class/sensors/proximity_sensor/prox_cal
    $ echo 1 > /sys/class/sensors/proximity_sensor/prox_cal

    The zero resets the actual calibration offset.
    The one does an auto calibration (read sensor value, set offset to this sensor value, write calibration offset to "/efs/prox_cal" which is read while device is booting).
    Best for calibrate your sensor is to keep it dark, the glass have to be clean and the sensor free (so that the sensor doesn't measure anything).
    The calibration offset is stored in efs, thats why you can make full wipe and use other ROMs without the need of recalibration.

    You can check the running config by:
    Code:
    $ cat /sys/class/sensors/proximity_sensor/state
    The first value is the calibration Offset, the second one is the sensor threshold (threshold is set at compile time).

    Open *#0*# to see "sensors" and check if your proximity sensor is now working properly.


    Because in Kernel code (copyright by Samsung) for the device driver is somthing like this autocalibration, i bet that there is a secret menue or code that does the calibration too. But until someone discovers this secret we have to have root permissions to do a proximity sensor calibration.

    Hey, I've been looking for a fix for prox sensor on my Note 2 ever since I installed Paranoid back in december/january, went back to stock and it was still broken. This fixed it!! So thank you :) I have just one issue, it seems to go back to being broken when I reboot the phone. Is there any way to prevent this? Also the *#0*# doesn't work for me and the cat command returns just a 0. Thanks.

    EDIT: it might help to note that I'm running cyanogenmod 10.1 nightly now
    EDIT2: I figured it out! I did a search for prox_cal and found one in /sys/devices/virtual/sensors/proximity_sensor with the values 18,9. i put those values in the empty /efs/prox_cal. It now works on boot. :)