Changeset 40413


Ignore:
Timestamp:
05/13/17 12:26:36 (6 years ago)
Author:
gost
Message:

[titan] mipsel/arm new cec functions

Location:
titan/titan
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • titan/titan/cec.h

    r39704 r40413  
    33
    44int cecon = 0;
     5struct stimerthread* hdmiEventthread = NULL;
     6
     7
     8void sendName(unsigned char address)
     9{
     10        unsigned char cmd = 0x47;
     11        char data[16] = "TitanNit";
     12       
     13        data[8] = '\0';
     14        sendMessage(address, cmd, data, strlen(data));
     15
     16}
     17
     18void sendMenuInfo(unsigned char address)
     19{
     20        unsigned char cmd = 0x8e;
     21        char data[2];
     22               
     23        data[0] = 0x00;
     24        if(status.standby > 0 || getconfigint("cec_menue", NULL) == 0)
     25                data[0] = 0x01;
     26        data[1] = '\0';
     27        sendMessage(address, cmd, data, 1);
     28}
     29
     30void sendVendorid(unsigned char address)
     31{
     32        unsigned char cmd = 0x87;
     33        char data[4];
     34       
     35        data[0] = 0x00;
     36        data[1] = 0x00;
     37        data[2] = 0x00;
     38        data[3] = '\0';
     39        sendMessage(address, cmd, data, 3);
     40}
     41
     42void sendSource(unsigned char address)
     43{
     44        unsigned char cmd = 0x82;
     45        char data[4];
     46       
     47        data[0] = cec_physicalAddress[0];
     48        data[1] = cec_physicalAddress[1];
     49        data[2] = '\0';
     50        sendMessage(address, cmd, data, 2);
     51}
     52
     53void sendVersion(unsigned char address)
     54{
     55        unsigned char cmd = 0x9e;
     56        char data[4];
     57       
     58        data[0] = 0x01;
     59        data[1] = '\0';
     60        sendMessage(address, cmd, data, 2);
     61}
     62
     63void sendTVon()
     64{
     65        char data[3];
     66        unsigned char address = 0x00;
     67        unsigned char cmd = 0x04;
     68        data[0] = '\0';
     69        sendMessage(address, cmd, data, 0);
     70}
     71
     72void sendswitch()
     73{       
     74        char data[3];
     75        unsigned char address = 0x0f;
     76        unsigned char cmd = 0x82;
     77        data[0] = cec_physicalAddress[0];
     78        data[1] = cec_physicalAddress[1];
     79        data[2] = '\0';
     80        sendMessage(address, cmd, data, 2);
     81}
     82
     83int translateKey(unsigned char code)
     84{
     85        int key = 0;
     86        switch (code)
     87        {
     88                case 0x32:
     89                        key = 0x8b;
     90                        break;
     91                case 0x20:
     92                        key = 0x0b;
     93                        break;
     94                case 0x21:
     95                        key = 0x02;
     96                        break;
     97                case 0x22:
     98                        key = 0x03;
     99                        break;
     100                case 0x23:
     101                        key = 0x04;
     102                        break;
     103                case 0x24:
     104                        key = 0x05;
     105                        break;
     106                case 0x25:
     107                        key = 0x06;
     108                        break;
     109                case 0x26:
     110                        key = 0x07;
     111                        break;
     112                case 0x27:
     113                        key = 0x08;
     114                        break;
     115                case 0x28:
     116                        key = 0x09;
     117                        break;
     118                case 0x29:
     119                        key = 0x0a;
     120                        break;
     121                case 0x30:
     122                        key = 0x192;
     123                        break;
     124                case 0x31:
     125                        key = 0x193;
     126                        break;
     127                case 0x44:
     128                        key = 0xcf;
     129                        break;
     130                case 0x45:
     131                        key = 0x80;
     132                        break;
     133                case 0x46:
     134                        key = 0x77;
     135                        break;
     136                case 0x47:
     137                        key = 0xa7;
     138                        break;
     139                case 0x48:
     140                        key = 0xa8;
     141                        break;
     142                case 0x49:
     143                        key = 0xd0;
     144                        break;
     145                case 0x53:
     146                        key = 0x166;
     147                        break;
     148                case 0x54:
     149                        key = 0x16a;
     150                        break;
     151                case 0x60:
     152                        key = 0xcf;
     153                        break;
     154                case 0x61:
     155                        key = 0xa4;
     156                        break;
     157                case 0x62:
     158                        key = 0xa7;
     159                        break;
     160                case 0x64:
     161                        key = 0x80;
     162                        break;
     163                case 0x00:
     164                        key = 0x160;
     165                        break;
     166                case 0x03:
     167                        key = 0x69;
     168                        break;
     169                case 0x04:
     170                        key = 0x6a;
     171                        break;
     172                case 0x01:
     173                        key = 0x67;
     174                        break;
     175                case 0x02:
     176                        key = 0x6c;
     177                        break;
     178                case 0x0d:
     179                        key = 0xae;
     180                        break;
     181                case 0x72:
     182                        key = 0x18e;
     183                        break;
     184                case 0x71:
     185                        key = 0x191;
     186                        break;
     187                case 0x73:
     188                        key = 0x18f;
     189                        break;
     190                case 0x74:
     191                        key = 0x190;
     192                        break;
     193                default:
     194                        key = 0x8b;
     195                        break;
     196        }
     197        return key;
     198}
     199       
     200void setVolumeForward()
     201{
     202        unsigned char address = 0x00;
     203        unsigned char cmd = 0x7d;
     204        char data[2];
     205        data[0] = '\0';
     206       
     207        addconfiginttmp("ForwardVolume", 1);
     208        data[0] = '\0';
     209        if(getconfigint("cec_volume", NULL) > 0)
     210        {
     211                if(getconfigint("cec_volume", NULL) == 1)
     212                        address = 0x05;
     213                if(getconfigint("cec_volume", NULL) == 2)
     214                        address = 0x00;
     215               
     216                //cmd = 0x72;
     217                //data[0] = 0x01;
     218                //data[1] = '\0';
     219                //m_lock(&status.cecmutex, 26);
     220                //sendMessage(address, cmd, data, strlen(data));
     221                //m_unlock(&status.cecmutex, 26);
     222               
     223                //cmd = 0x70;
     224                //data[0] = 0x02;
     225                //data[1] = 0x00;
     226                //data[2] = '\0';
     227                //m_lock(&status.cecmutex, 26);
     228                //sendMessage(address, cmd, data, 2);
     229                //m_unlock(&status.cecmutex, 26);
     230               
     231                cmd = 0x7d;
     232                data[0] = '\0';
     233                sendMessage(address, cmd, data, strlen(data));
     234
     235        }
     236}
    5237
    6238void hdmiEvent()
     
    8240        fd_set rfds;
    9241        struct timeval tv;
    10         struct cec_message rxmessage;
    11         int ret = 0, len = 0;
    12        
    13         while(1)
    14         {
     242        struct cec_rx_message rxmessage;
     243        int ret = 0;
     244        int hasdata = 0;
     245        int keypressed = 0;
     246        int transkey = 0;
     247        unsigned char pressedkey = 0x00;
     248       
     249        while (hdmiEventthread->aktion != STOP)
     250        {
     251                printf("**** start Thread\n");
    15252                tv.tv_sec = 0x7fffffff;
    16253                tv.tv_usec = 0;
     
    18255                FD_SET(status.hdmiFd, &rfds);
    19256
     257                hasdata = 0;
     258
    20259                ret = select(status.hdmiFd + 1, &rfds, NULL, NULL, &tv);
    21                        
    22260                if(ret > 0)
    23261                {
     
    25263                        {
    26264#ifdef DREAMBOX
    27                                 ret = ioctl(status.hdmiFd, 2, &rxmessage);
    28                                 if(ret == 0)
    29                                         len = rxmessage.length;
     265                                if (ioctl(status.hdmiFd, 2, &rxmessage) >= 0)
     266                                        hasdata = 1;
     267                               
    30268                                unsigned int val = 0;
    31                                 ioctl(status.hdmiFd, 4, &val); 
     269                                ioctl(status.hdmiFd, 4, &val);
    32270#else
    33                                 len = read(status.hdmiFd, &rxmessage, sizeof(struct cec_message));
     271                                if (read(status.hdmiFd, &rxmessage, 2) == 2)
     272                                {
     273                                        if (read(status.hdmiFd, &rxmessage.data, rxmessage.length) == rxmessage.length)
     274                                                hasdata = 1;
     275                                }
    34276#endif
    35                                 if(len > 0)
     277                                if(hasdata)
    36278                                {
    37                                         printf("reveived adress: %02x datalen: %02x cmd: %02x\n", rxmessage.address, rxmessage.length, rxmessage.data[0]);
     279                                        printf("CEC: rxmessage ->");
     280                                        printf(" %02x ", rxmessage.address);
     281                                        for (int i = 0; i < rxmessage.length; i++)
     282                                                printf(" %02x", rxmessage.data[i]);
     283                                        printf("\n");
     284                                       
     285                                        switch (rxmessage.data[0])
     286                                        {
     287                                                case 0x7e:
     288                                                case 0x72: /* system audio mode status */
     289                                                {
     290                                                        if(rxmessage.data[1] == 0x01)
     291                                                        {
     292                                                                addconfiginttmp("ForwardVolume", 1);
     293                                                                printf("HDMI_CEC: Volume forward is acticated\n");     
     294                                                        }
     295                                                        else
     296                                                        {
     297                                                                printf("HDMI_CEC: Volume forward is not supported\n"); 
     298                                                                addconfiginttmp("ForwardVolume", 0);
     299                                                        }
     300                                                        break;
     301                                                }
     302                                               
     303                                                case 0x46: /* request name */
     304                                                {
     305                                                        sendName(rxmessage.address);
     306                                                        break;
     307                                                }
     308                                                case 0x8c: /* request vendor id */
     309                                                {
     310                                                        sendVendorid(rxmessage.address);
     311                                                        break;
     312                                                }
     313                                                case 0x8d: /* menu request */
     314                                                {
     315                                                        //if(rxmessage.data[1] == 0x02)
     316                                                                sendMenuInfo(rxmessage.address);
     317                                                        break;
     318                                                }
     319                                                case 0x82:
     320                                                {
     321                                                //cecon = 0;
     322                                                //sendTVon();
     323                                                sendswitch();
     324                                                setFixedPhysicalAddress(getconfigint("cec_fixedAddress", NULL));
     325                                                reportPhysicalAddress(0);
     326                                                sendMenuInfo(0x00);
     327                                                setVolumeForward();
     328                                                }
     329                                                case 0x00: /* feature abort */
     330                                                {
     331                                                        if(rxmessage.data[1] == 0x44 || rxmessage.data[1] == 0x7d)
     332                                                        {
     333                                                                addconfiginttmp("ForwardVolume", 0);
     334                                                                printf("HdmiCec: volume forwarding not supported by device %02x\n", rxmessage.address);
     335                                                        }
     336                                                        break;
     337                                                }
     338                                                case 0x44: /* key pressed */
     339                                                {
     340                                                        keypressed = 1;
     341                                                        pressedkey = rxmessage.data[1];
     342                                                        transkey = translateKey(pressedkey);
     343                                                        writerc(transkey);
     344                                                        break;
     345                                                }
     346                                                case 0x45: /* key released */
     347                                                {
     348                                                        printf("HdmiCec: key received  -- %02x\n", pressedkey);
     349                                                        transkey = translateKey(pressedkey);
     350                                                        printf("HdmiCec: key TitanCode -- %i\n", transkey);
     351                                                        //writerc(transkey);
     352                                                        keypressed = 0;
     353                                                        break;
     354                                                }
     355                                                case 0x83: /* request address */
     356                                                {
     357                                                        reportPhysicalAddress(1);
     358                                                        break;
     359                                                }
     360                                                case 0x85: /* request active source */
     361                                                {
     362                                                        sendSource(rxmessage.address);
     363                                                        break;
     364                                                }
     365                                                case 0x9f: /* request cec version */
     366                                                {
     367                                                        sendVersion(rxmessage.address);
     368                                                        break;
     369                                                }
     370                                        }
    38371                                }
    39372                        }
     
    46379                        sleep(1);
    47380                }               
    48         }       
     381        }
     382        hdmiEventthread = NULL;
     383        printf("**** stop Thread\n");   
    49384}       
    50385
     
    61396        if (status.hdmiFd >= 0)
    62397        {
    63                 printf("eHdmiCEC: send message\n");
     398                printf("HdmiCEC: send message\n");
    64399                printf("%02x ", message.address);
    65400                for(i = 0; i < message.length; i++)
     
    81416}
    82417
     418void sendMessageReal_thread(struct stimerthread* timernode, struct cec_message* message, int flag)
     419{
     420        m_lock(&status.cecmutex, 26);
     421        int i = 0;
     422        if (status.hdmiFd >= 0)
     423        {
     424                printf("HdmiCEC: send message\n");
     425                printf("%02x ", message->address);
     426                for(i = 0; i < message->length; i++)
     427                {
     428                        printf(" %02X", message->data[i]);
     429                }
     430                printf("\n");
     431                int ret = 0;
     432#ifdef DREAMBOX
     433                message->flag = 1;
     434                ret = ioctl(status.hdmiFd, 3, message);
     435                if(ret == 0)
     436                        ret = 1 + message->length;
     437#else
     438                ret = write(status.hdmiFd, message, 2 + message->length);
     439#endif
     440                printf("%i Bytes wurden gesendet\n", ret);
     441        }
     442        free(message); message=NULL;
     443        usleep(100000);
     444        m_unlock(&status.cecmutex, 26);
     445}
     446
     447void sendMessageReal_add(struct cec_message message)
     448{
     449        struct cec_message* smessage;
     450        smessage = calloc(1, sizeof(struct cec_message));
     451        if(smessage == NULL)
     452        {
     453                err("no mem");
     454                return;
     455        }
     456        memcpy(smessage, &message, sizeof(struct cec_message));
     457        addtimer(&sendMessageReal_thread, START, 1000, 1, (void*)smessage, NULL, NULL);
     458}
     459       
     460
    83461void sendMessage(unsigned char address, unsigned char cmd, char *data, int length)
    84462{
     
    89467        message.data[0] = cmd;
    90468        memcpy(&message.data[1], data, length);
    91         sendMessageReal(message);
    92 }
    93 
    94 void reportPhysicalAddress()
     469        sendMessageReal_add(message);
     470}
     471
     472void reportPhysicalAddress(int flag)
    95473{
    96474        struct cec_message txmessage;
     
    101479        txmessage.data[3] = cec_deviceType;
    102480        txmessage.length = 4;
    103         sendMessageReal(txmessage);
    104         sleep(1);
     481        sendMessageReal_add(txmessage);
    105482}
    106483
     
    163540                        cec_deviceType = addressinfo.type;
    164541                        cec_logicalAddress = addressinfo.logical;
    165                         printf("eHdmiCEC: detected deviceType: %02X\n", addressinfo.type);
    166                         printf("eHdmiCEC: detected logical address: %02X\n", addressinfo.logical);
    167                         printf("eHdmiCEC: detected physical address: %02X%02X\n", addressinfo.physical[0], addressinfo.physical[1]);
     542                        printf("HdmiCEC: detected deviceType: %02X\n", addressinfo.type);
     543                        printf("HdmiCEC: detected logical address: %02X\n", addressinfo.logical);
     544                        printf("HdmiCEC: detected physical address: %02X%02X\n", addressinfo.physical[0], addressinfo.physical[1]);
    168545                        if (status.cec_fixedAddress == 0)
    169546                        {
     547                                //if(cecon > 0)
    170548                                if (memcmp(cec_physicalAddress, addressinfo.physical, sizeof(cec_physicalAddress)))
    171549                                {
    172                                         printf("eHdmiCEC: detected physical address change: %02X%02X --> %02X%02X\n", cec_physicalAddress[0], cec_physicalAddress[1], addressinfo.physical[0], addressinfo.physical[1]);
     550                                        printf("HdmiCEC: detected physical address change: %02X%02X --> %02X%02X\n", cec_physicalAddress[0], cec_physicalAddress[1], addressinfo.physical[0], addressinfo.physical[1]);
    173551                                        memcpy(cec_physicalAddress, addressinfo.physical, sizeof(cec_physicalAddress));
    174                                         reportPhysicalAddress();
     552                                        reportPhysicalAddress(0);
    175553                                        /* emit */ //addressChanged((cec_physicalAddress[0] << 8) | cec_physicalAddress[1]);
    176554                                }
     
    195573        struct skin* tvswitch = getscreennode(cec, "tvswitch");
    196574        struct skin* cecfix = getscreennode(cec, "cecfix");
     575        struct skin* volume = getscreennode(cec, "volume");
     576        struct skin* menue = getscreennode(cec, "menue");
    197577        int rcret = 0;
    198578        int help = 0;   
     
    240620        else
    241621                setchoiceboxselection(cecfix, "1");
     622       
     623        addchoicebox(volume, "0", _("none"));
     624        addchoicebox(volume, "1", _("Receiver"));
     625        addchoicebox(volume, "2", _("TV"));
     626        setchoiceboxselection(volume, getconfig("cec_volume", NULL));
     627       
     628        addchoicebox(menue, "0", _("off"));
     629        addchoicebox(menue, "1", _("on"));
     630        setchoiceboxselection(menue, getconfig("cec_menue", NULL));
    242631       
    243632       
     
    253642                tvswitch->hidden = YES;
    254643                cecfix->hidden = YES;
     644                volume->hidden = YES;
     645                menue->hidden = YES;
    255646        }
    256647        else
     
    265656                tvswitch->hidden = NO;
    266657                cecfix->hidden = NO;   
     658                volume->hidden = NO;
     659                menue->hidden = NO;
    267660        }
    268661
     
    289682                                tvswitch->hidden = YES;
    290683                                cecfix->hidden = YES;   
     684                                volume->hidden = YES;
     685                                menue->hidden = YES;
    291686                        }
    292687                        else
     
    301696                                tvswitch->hidden = NO; 
    302697                                cecfix->hidden = NO;   
     698                                volume->hidden = NO;
     699                                menue->hidden = NO;
    303700                        }
    304701                }
     
    316713                        addconfig("cec_rec_on", recon->ret);
    317714                        addconfig("cec_tv_switch", tvswitch->ret);
     715                        addconfig("cec_volume", volume->ret);
     716                        addconfig("cec_menue", menue->ret);
    318717                        if(ostrcmp(cecfix->ret, "0") == 0)
    319718                        {
    320719                                addconfig("cec_fixedAddress", "0");
    321                                 setFixedPhysicalAddress(0);
     720                                //setFixedPhysicalAddress(0);
    322721                        }
    323722                        else
     
    326725                                help = (cec_physicalAddress[0] << 8) | cec_physicalAddress[1] ;
    327726                                addconfigint("cec_fixedAddress", help);
    328                                 setFixedPhysicalAddress(help);
     727                                //setFixedPhysicalAddress(help);
    329728                        }
     729                        if(getconfigint("cec_activ", NULL) == 0 || getconfigint("cec_on", NULL) == 0)
     730                                cecinit();
    330731                        break;
    331732                }
     
    344745                cec_physicalAddress[1] = address & 0xff;
    345746                /* report our (possibly new) address */
    346                 reportPhysicalAddress();
     747                reportPhysicalAddress(0);
    347748        }
    348749        else
     
    362763        cec_logicalAddress = 1;
    363764        cec_deviceType = 1; /* default: recorder */
    364 
     765       
     766        if(getconfigint("cec_on", NULL) == 0)
     767        {
     768                addconfiginttmp("cec_activ", 0);
     769                if(hdmiEventthread != NULL)
     770                        hdmiEventthread->aktion = STOP;
     771                return;
     772        }
     773        addconfiginttmp("cec_activ", 1);
     774       
     775       
    365776#ifdef DREAMBOX
    366777        status.hdmiFd = open("/dev/misc/hdmi_cec0", O_RDWR | O_NONBLOCK);
     
    372783#endif
    373784       
    374         setFixedPhysicalAddress(getconfigint("cec_fixedAddress", NULL));
     785        if(hdmiEventthread == NULL)
     786                hdmiEventthread = addtimer(&hdmiEvent, START, 10000, 1, NULL, NULL, NULL);
     787               
     788        getAddressInfo();
     789       
    375790        if(checkbox("DM900") == 1 && getwaswakuptimer() != 1)
    376791        {       
     
    381796        return;
    382797}
    383                
     798
    384799void cecstandby()
    385800{
     
    396811                        address = 0x0f;
    397812                        sendMessage(address, cmd, data, strlen(data));
    398                         sleep(1);
    399813                }
    400814                if(getconfigint("cec_tv_off", NULL) == 1)
     
    402816                        address = 0x00;
    403817                        sendMessage(address, cmd, data, strlen(data));
    404                         sleep(1);
     818                        //sleep(1);
    405819                }
    406820                if(getconfigint("cec_rec_off", NULL) == 1)
     
    408822                        address = 0x05;
    409823                        sendMessage(address, cmd, data, strlen(data));
    410                         sleep(1);
     824                        //sleep(1);
    411825                }
    412826        }
     
    427841                        address = 0x0f;
    428842                        sendMessage(address, cmd, data, 0);
    429                         sleep(1);
     843                        //sleep(1);
    430844                }
    431845                if(getconfigint("cec_rec_on", NULL) == 1)
     
    433847                        address = 0x05;
    434848                        sendMessage(address, cmd, data, 0);
    435                         sleep(1);
     849                        //sleep(1);
    436850                }
    437851                if(getconfigint("cec_tv_on", NULL) == 1)
     
    439853                        address = 0x00;
    440854                        sendMessage(address, cmd, data, 0);
    441                         sleep(1);
     855                        //sleep(1);
    442856                }
    443857                if(getconfigint("cec_tv_switch", NULL) == 1)
     
    449863                        data[2] = '\0';
    450864                        sendMessage(address, cmd, data, 2);
    451                         sleep(1);
     865                        //sleep(1);
    452866                }
    453867                cecon = 1;
    454         }
    455 }
    456 
     868                printf("**********wakeup\n");   
     869        }
     870        if(cecon < 2)
     871        {
     872                //setFixedPhysicalAddress(getconfigint("cec_fixedAddress", NULL));
     873                //setVolumeForward();
     874                //sendMenuInfo(0x00);
     875                cecon = 2;
     876        }
     877}
     878
     879void forwardKey(int key)
     880{
     881        char data[3];
     882        unsigned char address = 0x00;
     883        unsigned char cmd = 0x44;
     884       
     885        data[0] = '\0';
     886       
     887        if(getconfigint("cec_volume", NULL) == 1)
     888                        address = 0x05;
     889        else if(getconfigint("cec_volume", NULL) == 2)
     890                        address = 0x00;
     891       
     892        if(key == getrcconfigint("rcvolup", NULL))
     893                data[0] = 0x41;
     894        else if(key == getrcconfigint("rcvoldown", NULL))
     895                data[0] = 0x42;
     896        else if(key == getrcconfigint("rcmute", NULL))
     897                data[0] = 0x43;
     898               
     899        data[1] = '\0';
     900        sendMessage(address, cmd, data, 1);
     901        data[0] = '\0';
     902        cmd = 0x45;
     903        sendMessage(address, cmd, data, 0); /* release */
     904}
     905       
    457906#endif
  • titan/titan/mute.h

    r31946 r40413  
    1111        struct skin* mute = getscreen("mute");
    1212
     13        if(getconfigint("ForwardVolume", NULL) == 1)
     14        {
     15                forwardKey(getrcconfigint("rcmute", NULL));
     16                return;
     17        }
     18       
    1319        if(getconfig("stepmute", NULL) == NULL)
    1420                addconfig("stepmute", "0");
Note: See TracChangeset for help on using the changeset viewer.