temp_fan_daemon_a06.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. #!/usr/bin/python3
  2. import glob
  3. import os
  4. import sys,getopt
  5. import subprocess
  6. import time
  7. cpus = []
  8. mid_freq = 0
  9. max_freq = 0
  10. MAX_TEMP=70000
  11. ONCE_TIME=30
  12. def init_fan_gpio():
  13. os.popen("gpio mode 41 out")
  14. def fan_on():
  15. init_fan_gpio()
  16. os.popen("gpio write 41 1")
  17. time.sleep(ONCE_TIME)
  18. def fan_off():
  19. init_fan_gpio()
  20. os.popen("gpio write 41 0")
  21. def isDigit(x):
  22. try:
  23. float(x)
  24. return True
  25. except ValueError:
  26. return False
  27. def cpu_infos():
  28. global cpus
  29. global mid_freq
  30. global max_freq
  31. cpus = glob.glob('/sys/devices/system/cpu/cpu[0-9]')
  32. cpus.sort()
  33. #/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies
  34. #/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
  35. scaling_available_freq = open(os.path.join(cpus[0],"cpufreq/scaling_available_frequencies"),"r").read()
  36. scaling_available_freq = scaling_available_freq.strip("\n")
  37. scaling_available_freqs = scaling_available_freq.split(" ")
  38. for var in scaling_available_freqs:
  39. if isDigit(var):
  40. if(int(var) > 1000000):
  41. if(mid_freq == 0):
  42. mid_freq = int(var)
  43. max_freq = int(var)
  44. def set_gov(gov):
  45. global cpus
  46. for var in cpus:
  47. gov_f = os.path.join(var,"cpufreq/scaling_governor")
  48. #print(gov_f)
  49. subprocess.run( "echo %s | sudo tee %s" %(gov,gov_f),shell=True)
  50. def set_performance(scale):
  51. global cpus
  52. global mid_freq
  53. global max_freq
  54. freq = mid_freq
  55. if scale =="mid":
  56. freq = mid_freq
  57. elif scale =="max":
  58. freq = max_freq
  59. for var in cpus:
  60. _f = os.path.join(var,"cpufreq/scaling_max_freq")
  61. #print(_f)
  62. subprocess.run( "echo %s | sudo tee %s" %(freq,_f),shell=True)
  63. def fan_loop():
  64. while True:
  65. temps = glob.glob('/sys/class/thermal/thermal_zone[0-9]/')
  66. temps.sort()
  67. for var in temps:
  68. _f = os.path.join(var,"temp")
  69. #print( open(_f).read().strip("\n") )
  70. _t = open(_f).read().strip("\n")
  71. if isDigit(_t):
  72. if int(_t) > MAX_TEMP:
  73. fan_on()
  74. fan_off()
  75. time.sleep(5)
  76. def main(argv):
  77. global cpus
  78. scale = 'mid'
  79. gov = 'powersave'
  80. try:
  81. opts, args = getopt.getopt(argv,"hs:g:",["scale=","governor="])
  82. except getopt.GetoptError:
  83. print ('test.py -s <scale> -g <governor>')
  84. sys.exit(2)
  85. for opt, arg in opts:
  86. if opt == '-h':
  87. print ('test.py -s <scale>')
  88. sys.exit()
  89. elif opt in ("-s", "--scale"):
  90. scale = arg
  91. elif opt in ("-g","--governor"):
  92. gov = arg
  93. print ('Scale is ', scale,"Gov is ",gov)
  94. init_fan_gpio()
  95. cpu_infos()
  96. set_gov(gov)
  97. set_performance(scale)
  98. fan_loop()
  99. if __name__ == "__main__":
  100. main(sys.argv[1:])