| 1615 | */ |
| 1616 | |
| 1617 | void gpioClockSet (int pin, int freq) |
| 1618 | { |
| 1619 | int divi, divr, divf ; |
| 1620 | |
| 1621 | FailOnModel5("gpioClockSet"); |
| 1622 | if (!ToBCMPin(&pin)) { |
| 1623 | return; |
| 1624 | } |
| 1625 | |
| 1626 | divi = 19200000 / freq ; |
| 1627 | divr = 19200000 % freq ; |
| 1628 | divf = (int)((double)divr * 4096.0 / 19200000.0) ; |
| 1629 | |
| 1630 | if (divi > PWMCLK_DIVI_MAX) { |
| 1631 | divi = PWMCLK_DIVI_MAX; |
| 1632 | } |
| 1633 | *(clk + gpioToClkCon [pin]) = BCM_PASSWORD | GPIO_CLOCK_SOURCE ; // Stop GPIO Clock |
| 1634 | while ((*(clk + gpioToClkCon [pin]) & 0x80) != 0) // ... and wait |
| 1635 | ; |
| 1636 | |
| 1637 | *(clk + gpioToClkDiv [pin]) = BCM_PASSWORD | (divi << 12) | divf ; // Set dividers |
| 1638 | *(clk + gpioToClkCon [pin]) = BCM_PASSWORD | 0x10 | GPIO_CLOCK_SOURCE ; // Start Clock |
| 1639 | } |
| 1640 | |
| 1641 | |
| 1642 | /* |
no test coverage detected