This sounds more like a software than a firmware problem. You need to find some piece of software that knows how to read out your PC sensors and make it available to you for further handling.
On Windows this can be a great hassle because everything is shut close. Some programs like coretemp or Speedfan may be able to read the CPU temp, but I am not sure whether they have a API/SDK/protocol that could make it available to your own program for further processing.
You could hack the values out of it with some ReadProcessMemory calls, given that you stick to the same software version.
On Linux its as easy as typing "sensors" in the terminal and you get the temperature & analog readouts for all I/O controllers that are configured/loaded by the kernel. For example, this the "sensors" readout on my desktop machine:
acpitz-virtual-0l
Adapter: Virtual device
temp1: +27.8°C (crit = +106.0°C)
temp2: +29.8°C (crit = +106.0°C)
coretemp-isa-0000
Adapter: ISA adapter
Physical id 0: +30.0°C (high = +85.0°C, crit = +105.0°C)
Core 0: +32.0°C (high = +85.0°C, crit = +105.0°C)
Core 1: +25.0°C (high = +85.0°C, crit = +105.0°C)
Core 2: +31.0°C (high = +85.0°C, crit = +105.0°C)
Core 3: +31.0°C (high = +85.0°C, crit = +105.0°C)
nct6779-isa-0290
Adapter: ISA adapter
in0: +0.93 V (min = +0.00 V, max = +1.74 V)
in1: +1.02 V (min = +0.00 V, max = +0.00 V) ALARM
in2: +3.34 V (min = +0.00 V, max = +0.00 V) ALARM
in3: +3.34 V (min = +0.00 V, max = +0.00 V) ALARM
in4: +1.03 V (min = +0.00 V, max = +0.00 V) ALARM
in5: +2.04 V (min = +0.00 V, max = +0.00 V) ALARM
in6: +2.04 V (min = +0.00 V, max = +0.00 V) ALARM
in7: +3.44 V (min = +0.00 V, max = +0.00 V) ALARM
in8: +3.30 V (min = +0.00 V, max = +0.00 V) ALARM
in9: +1.07 V (min = +0.00 V, max = +0.00 V) ALARM
in10: +2.04 V (min = +0.00 V, max = +0.00 V) ALARM
in11: +2.04 V (min = +0.00 V, max = +0.00 V) ALARM
in12: +0.26 V (min = +0.00 V, max = +0.00 V) ALARM
in13: +0.18 V (min = +0.00 V, max = +0.00 V) ALARM
in14: +2.04 V (min = +0.00 V, max = +0.00 V) ALARM
fan1: 0 RPM (min = 0 RPM)
fan2: 436 RPM (min = 0 RPM)
fan3: 1053 RPM (min = 0 RPM)
fan4: 1094 RPM (min = 0 RPM)
fan5: 518 RPM (min = 0 RPM)
SYSTIN: +27.0°C (high = +0.0°C, hyst = +0.0°C) ALARM sensor = thermistor
CPUTIN: +28.5°C (high = +80.0°C, hyst = +75.0°C) sensor = thermistor
AUXTIN0: -63.0°C sensor = thermistor
AUXTIN1: -63.0°C sensor = thermistor
AUXTIN2: -63.0°C sensor = thermistor
AUXTIN3: -63.0°C sensor = thermistor
PCH_CHIP_CPU_MAX_TEMP: +0.0°C
PCH_CHIP_TEMP: +0.0°C
PCH_CPU_TEMP: +0.0°C
PCH_MCH_TEMP: +0.0°C
intrusion0: ALARM
intrusion1: ALARM
pkg-temp-0-virtual-0
Adapter: Virtual device
temp1: +32.0°C
I have Asus P8Z77-V PRO motherboard, and Asus provides a fan control utility for Windows. It can control all fans connected on the motherboard by (a poor, always reading too low) CPU temperature readout.
On Linux there is alternative "fancontrol" utility, which lets you set up fan speeds to whatever temperature sensor you want.
Some sensors may be incorrect though, especially on the nct6779 I/O controller (which I had to manually load, wasn't auto detected/recognized).
You probably don't need all those I/O controllers, usually CPU temp is auto recognized and thus always available for readout. You can probably grab it each X seconds out of the sensors command, and send it to your micro which will adjust the fan speed accordingly.
I have doubts if SMbus is really useful in this, because you would have to hack into the motherboards somewhere and passively probe the bus hoping for the readings to pass by. I am not certain whether the internal CPU sensor also runs over SMbus.