Subversion Repositories Kolibri OS

Rev

Rev 6878 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                              ;;
  3. ;; Copyright (C) KolibriOS team 2015-2017. All rights reserved. ;;
  4. ;; Distributed under terms of the GNU General Public License    ;;
  5. ;;                                                              ;;
  6. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  7.  
  8. format PE DLL native 0.05
  9. entry START
  10.  
  11.         DEBUG                   = 1
  12.         __DEBUG__               = 1
  13.         __DEBUG_LEVEL__         = 1             ; 1 = verbose, 2 = errors only
  14.  
  15.  
  16.         API_VERSION             = 0  ;debug
  17.  
  18.         STRIDE                  = 4      ;size of row in devices table
  19.  
  20.         SRV_GETVERSION          = 0
  21.  
  22. section '.flat' code readable writable executable
  23.  
  24. include '../proc32.inc'
  25. include '../struct.inc'
  26. include '../macros.inc'
  27. include '../peimport.inc'
  28. include '../fdo.inc'
  29.  
  30. GPIO_PORT_CONFIG_ADDR = 0xF100
  31. GPIO_DATA_ADDR = 0xF200
  32. ADC_ADDR = 0xFE00
  33.  
  34. proc START c, state:dword, cmdline:dword
  35.  
  36.         cmp     [state], 1
  37.         jne     .exit
  38. .entry:
  39.  
  40.         push    esi
  41.         DEBUGF  1,"Loading vortex86EX GPIO driver\n"
  42.         call    detect
  43.         pop     esi
  44.         test    eax, eax
  45.         jz      .fail
  46.  
  47. ; Set crossbar base address register in southbridge
  48.         invoke  PciWrite16, [bus], [dev], 0x64, 0x0A00 or 1
  49.  
  50. ; Set GPIO base address register in southbridge
  51.         invoke  PciWrite16, [bus], [dev], 0x62, GPIO_PORT_CONFIG_ADDR or 1
  52.  
  53.         DEBUGF  1,"Setting up ADC\n"
  54.  
  55. ; Enable ADC
  56.         invoke  PciRead32, [bus], [dev], 0xBC
  57.         and     eax, not (1 shl 28)
  58.         invoke  PciWrite32, [bus], [dev], 0xBC, eax
  59.  
  60. ; Set ADC base address
  61.         mov     ebx, [dev]
  62.         inc     ebx
  63.         invoke  PciRead16, [bus], ebx, 0xDE
  64.         or      ax, 0x02
  65.         invoke  PciWrite16, [bus], ebx, 0xDE, eax
  66.  
  67.         invoke  PciWrite32, [bus], ebx, 0xE0, 0x00500000 or ADC_ADDR
  68.  
  69. ; set up ADC
  70.         mov     dx, ADC_ADDR + 1
  71.         xor     al, al
  72.         out     dx, al
  73.  
  74. ; Empty FIFO
  75.   @@:
  76.         mov     dx, ADC_ADDR + 2        ; Status register
  77.         in      al, dx
  78.         test    al, 0x01                ; FIFO ready
  79.         jz      @f
  80.         mov     dx, ADC_ADDR + 4
  81.         in      ax, dx
  82.         jmp     @r
  83.   @@:
  84.  
  85. ; Enable GPIO0-9
  86.         mov     dx, GPIO_PORT_CONFIG_ADDR + 0  ; General-Purpose I/O Data & Direction Decode Enable
  87.         mov     eax, 0x000001ff
  88.         out     dx, eax
  89.  
  90.         mov     ecx, 10                 ; 10 GPIO ports total
  91.         mov     dx, GPIO_PORT_CONFIG_ADDR + 4  ; General-Purpose I/O Port0 Data & Direction Decode Address
  92.         mov     ax, GPIO_DATA_ADDR
  93.   .gpio_init:
  94. ; Set GPIO data port base address
  95.         out     dx, ax
  96.         add     ax, 2
  97.         add     dx, 2
  98. ; Set GPIO direction base address
  99.         out     dx, ax
  100.         add     ax, 2
  101.         add     dx, 2
  102. ; loop
  103.         dec     ecx
  104.         jnz     .gpio_init
  105.  
  106. ; Set GPIO0 pin 0-7 as output
  107.         mov     al, 0xff
  108.         mov     dx, GPIO_DATA_ADDR + 0*4 + 2
  109.         out     dx, al
  110.  
  111.         invoke  RegService, my_service, service_proc
  112.         ret
  113.   .fail:
  114.   .exit:
  115.         xor     eax, eax
  116.         ret
  117. endp
  118.  
  119. proc service_proc stdcall, ioctl:dword
  120.  
  121.         mov     ebx, [ioctl]
  122.         mov     eax, [ebx+IOCTL.io_code]
  123.         cmp     eax, SRV_GETVERSION
  124.         jne     @F
  125.  
  126.         mov     eax, [ebx+IOCTL.output]
  127.         cmp     [ebx+IOCTL.out_size], 4
  128.         jne     .fail
  129.         mov     dword [eax], API_VERSION
  130.         xor     eax, eax
  131.         ret
  132.   @@:
  133.         cmp     eax, 1  ; read GPIO P0
  134.         jne     .no_gpioread
  135.         mov     dx, GPIO_DATA_ADDR + 0x00
  136.         in      al, dx
  137.         ret
  138.   .no_gpioread:
  139.         cmp     eax, 2  ; write GPIO P0
  140.         jne     .no_gpiowrite
  141.  
  142.         mov     eax, [ebx + IOCTL.input]
  143.         mov     dx, GPIO_DATA_ADDR + 0x00
  144.         out     dx, al
  145.         xor     eax, eax
  146.         ret
  147.   .no_gpiowrite:
  148.         cmp     eax, 3  ; read single ADC channel
  149.         jne     .no_adcread
  150.  
  151.         mov     ecx, [ebx + IOCTL.input]
  152.         cmp     ecx, 8
  153.         jae     .fail
  154.  
  155.         mov     dx, ADC_ADDR + 1
  156.         mov     al, 1 shl 3             ; Power down ADC
  157.         out     dx, al
  158.  
  159.         mov     dx, ADC_ADDR + 0        ; AUX channel select register
  160.         mov     al, 1
  161.         shl     ax, cl
  162.         out     dx, al
  163.  
  164.         mov     dx, ADC_ADDR + 1
  165.         mov     al, 1 shl 0             ; Single shot, no interrupts, start
  166.         out     dx, al
  167.  
  168.         mov     dx, ADC_ADDR + 2
  169.   @@:
  170.         in      al, dx
  171.         test    al, 1 shl 0             ; data ready?
  172.         jz      @r
  173.  
  174.         mov     dx, ADC_ADDR + 4
  175.         in      ax, dx                  ; read the data from the FIFO and return to user call
  176.         ret
  177.   .no_adcread:
  178.   .fail:
  179.         or      eax, -1
  180.         ret
  181. endp
  182.  
  183.  
  184. proc detect
  185.         push    ebx
  186.         invoke  GetPCIList
  187.         mov     ebx, eax
  188.   .next_dev:
  189.         mov     eax, [eax+PCIDEV.fd]
  190.         cmp     eax, ebx
  191.         jz      .err
  192.         mov     edx, [eax+PCIDEV.vendor_device_id]
  193.  
  194.         mov     esi, devices
  195.   @@:
  196.         cmp     dword [esi], 0
  197.         jz      .next_dev
  198.         cmp     edx, [esi]
  199.         jz      .found
  200.  
  201.         add     esi, STRIDE
  202.         jmp     @B
  203.  
  204.   .found:
  205.         movzx   ebx, [eax+PCIDEV.devfn]
  206.         mov     [dev], ebx
  207.         movzx   ebx, [eax+PCIDEV.bus]
  208.         mov     [bus], ebx
  209.         xor     eax, eax
  210.         inc     eax
  211.         pop     ebx
  212.         ret
  213.   .err:
  214.         DEBUGF  1,"Could not find vortex86EX south bridge!\n"
  215.         xor     eax, eax
  216.         pop     ebx
  217.         ret
  218. endp
  219.  
  220. DEVICE_ID    = 6011h
  221. VENDOR_ID    = 17F3h
  222.  
  223. ;all initialized data place here
  224.  
  225. align 4
  226. devices      dd (DEVICE_ID shl 16)+VENDOR_ID
  227.              dd 0    ;terminator
  228.  
  229. my_service   db '86DUINO-GPIO',0  ;max 16 chars include zero
  230.  
  231. include_debug_strings                           ; All data wich FDO uses will be included here
  232.  
  233. dev     dd ?
  234. bus     dd ?
  235.  
  236. align 4
  237. data fixups
  238. end data
  239.