A modern Music Player Daemon based on Rockbox open source high quality audio player
libadwaita audio rust zig deno mpris rockbox mpd
at master 105 lines 3.1 kB view raw
1/*************************************************************************** 2 * __________ __ ___. 3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___ 4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / 5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < 6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ 7 * \/ \/ \/ \/ \/ 8 * $Id$ 9 * 10 * Copyright (C) 2008 by Rob Purchase 11 * 12 * This program is free software; you can redistribute it and/or 13 * modify it under the terms of the GNU General Public License 14 * as published by the Free Software Foundation; either version 2 15 * of the License, or (at your option) any later version. 16 * 17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 18 * KIND, either express or implied. 19 * 20 ****************************************************************************/ 21#include "pcf50606.h" 22#include "i2c.h" 23 24#define PCF50606_ADDR 0x10 25 26int pcf50606_write(int address, unsigned char val) 27{ 28 unsigned char data[] = { address, val }; 29 return i2c_write(PCF50606_ADDR, data, 2); 30} 31 32int pcf50606_write_multiple(int address, const unsigned char* buf, int count) 33{ 34 int i; 35 36 for (i = 0; i < count; i++) 37 pcf50606_write(address + i, buf[i]); 38 39 return 0; 40} 41 42int pcf50606_read(int address) 43{ 44 unsigned char val = -1; 45 i2c_readmem(PCF50606_ADDR, address, &val, 1); 46 return val; 47} 48 49int pcf50606_read_multiple(int address, unsigned char* buf, int count) 50{ 51 return i2c_readmem(PCF50606_ADDR, address, buf, count); 52} 53 54void pcf50606_init(void) 55{ 56#ifdef COWON_D2 57 /* Set outputs as per OF - further investigation required. */ 58 static const char init_data[] = 59 {PCF5060X_DCDEC1, 0xe4, 60 PCF5060X_IOREGC, 0xf5, 61 PCF5060X_D1REGC1, 0xf5, 62 PCF5060X_D2REGC1, 0xe9, 63 PCF5060X_D3REGC1, 0xf8, /* WM8985 3.3v */ 64 PCF5060X_DCUDC1, 0xe7, 65 PCF5060X_LPREGC1, 0x0, 66 PCF5060X_LPREGC2, 0x2, 67 0}; 68 69 const char* ptr; 70 for (ptr = init_data; *ptr != 0; ptr += 2) 71 pcf50606_write(ptr[0], ptr[1]); 72#endif 73} 74 75#if (defined(IAUDIO_X5) || defined(IAUDIO_M5) || defined(COWON_D2)) && !defined (SIMULATOR) 76void pcf50606_reset_timeout(void) 77{ 78 int level = disable_irq_save(); 79 pcf50606_write(PCF5060X_OOCC1, pcf50606_read(PCF5060X_OOCC1) | TOTRST); 80 restore_irq(level); 81} 82#endif 83 84void pcf50606_read_adc(int adc, short* res1, short* res2) 85{ 86 int adcs1 = 0, adcs2 = 0, adcs3 = 0; 87 88 int level = disable_irq_save(); 89 90 pcf50606_write(PCF5060X_ADCC2, (adc<<1) | 1); /* ADC start */ 91 92 do { 93 adcs2 = pcf50606_read(PCF5060X_ADCS2); 94 } while (!(adcs2 & 0x80)); /* Busy wait on ADCRDY flag */ 95 96 adcs1 = pcf50606_read(PCF5060X_ADCS1); 97 if (res2 != NULL) adcs3 = pcf50606_read(PCF5060X_ADCS3); 98 99 pcf50606_write(PCF5060X_ADCC2, 0); /* ADC stop */ 100 101 restore_interrupt(level); 102 103 if (res1 != NULL) *res1 = (adcs1 << 2) | (adcs2 & 3); 104 if (res2 != NULL) *res2 = (adcs3 << 2) | ((adcs2 & 0xC) >> 2); 105}