Linux Embarqué

Makia42 Messages postés 29 Date d'inscription lundi 11 janvier 2010 Statut Membre Dernière intervention 19 septembre 2010 - 14 janv. 2010 à 15:36
cs_rosaliaa Messages postés 3 Date d'inscription samedi 20 septembre 2008 Statut Membre Dernière intervention 12 avril 2010 - 12 avril 2010 à 11:40
Bonjour,

Je travail en ce moment sur un système embarqué, et dans le cadre d'un projet, je dois faire communiquer par voix deux systèmes embarqués entre eux.

Dans un premier temps je cherchais donc à tester tout simplement le son sur un système, qui contient la version 2.6.24 de linux.

Je me suis inspirer de quelques utilitaires que l'on trouve dans l'architecture Alsa et voici ce que ça donne en codes ces quelques lignes :

#include <stdio.h>
#include <errno.h>
#include <string.h>
#include
#include <fcntl.h>
#include <linux/ioctl.h>
//#include <linux/time.h>
#include
#include <sound/asound.h>

main()
{
int i,j,t;
FILE *fp;
int ret;
int f;
int ver;
struct snd_pcm_info info;
struct snd_pcm_channel_info c_info;
struct snd_pcm_status state;
struct snd_pcm_hw_params hwp;
struct snd_pcm_sw_params swp;

int version=0;

memset (&info,0,sizeof(info));
memset (&c_info,0,sizeof(c_info));
memset (&state,0,sizeof(state));
memset (&hwp, 0, sizeof(hwp));
memset (&swp, 0, sizeof(swp));

f=open("/dev/snd/pcmC0D0p", O_RDWR|O_NONBLOCK);
if (f>=0) {
printf("device open with File descriptor f=%d\n", f);
#if 1
ret=ioctl(f, SNDRV_PCM_IOCTL_PVERSION, &version);
if (ret==0)
printf("IOCTL_PVERSION version is %d\n",version);
else
printf ("ioctl ret=%d errno=%d %s\n",ret, errno,strerror(errno));
#endif
#if 1
ret=ioctl(f, SNDRV_PCM_IOCTL_INFO, &info);
if (ret==0)
printf("IOCTL_INFO device is %d subdevice=%d card=%d name=%s\n",info.device,info.subdevice,info.card,info.name);
else
printf ("ioctl ret=%d errno=%d %s\n",ret, errno,strerror(errno));
#endif
#if 0
ret=ioctl(f, SNDRV_PCM_IOCTL_CHANNEL_INFO, &c_info);
if (ret==0)
printf("IOCTL_INFO Channel is %d first=%d step=%d\n",c_info.channel,c_info.first,c_info.step);
else
printf ("ioctl ret=%d errno=%d %s\n",ret, errno,strerror(errno));
#endif
#if 0
ret=ioctl(f, SNDRV_PCM_IOCTL_STATUS, &state);
if (ret==0)
printf("IOCTL_STATUS State is %d\n",state.state);
else
printf ("IOCTL_STATUS ret=%d errno=%d %s\n",ret, errno,strerror(errno));
#endif
#if 1
ret=ioctl(f, SNDRV_PCM_IOCTL_HW_PARAMS, &hwp);
if (ret==0)
printf("IOCTL_HW_PARAMS flags is %d\n",hwp.flags);
else
printf ("IOCTL_HW_PARAMS ret=%d errno=%d %s\n",ret, errno,strerror(errno));

#endif

ret=ioctl(f, SNDRV_PCM_IOCTL_SW_PARAMS, &swp);
if (ret==0)
printf("IOCTL_SW_PARAMS mode is %d\n",swp.tstamp_mode);
else
printf ("IOCTL_SW_PARAMS ret=%d errno=%d %s\n",ret, errno,strerror(errno));


ret=ioctl(f, SNDRV_PCM_IOCTL_START);
if (ret==0)
printf("IOCTL_ Start is OK\n");
else
printf ("IOCTL_START ret=%d errno=%d %s\n",ret, errno,strerror(errno));

for (i=0; i<1;i++) {
for (j=1;j<25;j++) {
t=0;
ret=read(f,&t,1);
// ret=putc(j,fp);
printf("ret=%d t=%d errno=%d",ret,t,errno);
ret=write(f,&j,1);
if (ret==EOF)
printf("ERREUR %d %s ",errno,strerror(errno));
}
}
}
else
printf("ERROR OPENNING FILE\n");


résultat à la compilation :

[b][root@eseco-ivan bouhara]# ./a.out
device open with File descriptor f=3
IOCTL_PVERSION version is 131080
IOCTL_INFO device is 0 subdevice=0 card=0 name=SiS SI7012
IOCTL_HW_PARAMS ret=-1 errno=22 Invalid argument
IOCTL_SW_PARAMS ret=-1 errno=77 File descriptor in bad state
IOCTL_START ret=-1 errno=77 File descriptor in bad state
ret=-1 t=0 errno=22ERREUR 77 File descriptor in bad state ret=-1 t=0 errno=22ERREUR.../b

Est-il possible de piloter la carte son sans passer par des interfaces multimédias ?

Peut-on envoyer un son directement sur les speakers(avec un /dev/..par exemple) ?

J'ai tout essayer pour éviter d'avoir à télécherger des packages mais il semble qu'il ne soit pas possible de faire sans pour un simple test son sur un Linux embarqué ...

3 réponses

Makia42 Messages postés 29 Date d'inscription lundi 11 janvier 2010 Statut Membre Dernière intervention 19 septembre 2010
26 janv. 2010 à 13:45
Bonjour à tous,

Je poste la solution à mon problème concernant donc le test son ur une plateforme embarqué avec pour OS Linux.

On peut utiliser ALSA sans les librairies ni OSS.
C'est possible grâce aux IOCTL

Le projet Source forge Alsasimple donne un exemple:
https://alsasimple.svn.sourceforge.net/ ? lsasimple/
_________________
K.Bouhara & I.Lovric
ESECO SYSTEMS
http://www.eseco.fr
Web3.0 and Web4.0 appliances for security and risk protection
Hors ligne
cs_rosaliaa Messages postés 3 Date d'inscription samedi 20 septembre 2008 Statut Membre Dernière intervention 12 avril 2010
12 avril 2010 à 11:37
Bonjour,
Je suis entrain de développer un driver vidéo sous linux embarqué
et mon problème c'est avec les ioctl et write et read (toutes les fonctions driver) retournent une erreur de type 'invalid argument", pourtant j'ai tout vérifier et voilà un exemple de code pour la fonction VID_Write:

int32 VID_Write(uint8 *p_Data, uint32 i_Size)
{
int i_FileId

/* first check parameters */
if( (p_Handle NULL) || (i_Size 0) || (p_Data == NULL) )
return(VID_ERROR_PARAM);



i_Ret = write(i_FileId, p_Data, i_Size);
if(i_Ret < 0)
{
TRACE_ERROR("write : %s", strerror(errno));
return(VID_ERROR_WRITE);
}
return(0);
}

Tous les paramètres sont bien vérifiés
(j'ai essayé d'utiliser des drivers usb et insérer les modules nécessaires, le matériel est détecté mais aucun module n'a pa été inséré)

Plz j'ai besoin d'aide si quelq'un pourrait m'indiquer une solution
Merci d'avance
cs_rosaliaa Messages postés 3 Date d'inscription samedi 20 septembre 2008 Statut Membre Dernière intervention 12 avril 2010
12 avril 2010 à 11:40
Désolée le code de la fonction est le suivant:

int32 VID_Write(uint8 *p_Data, uint32 i_Size)
{
int i_FileId
int32 i_Ret;


i_Ret = write(i_FileId, p_Data, i_Size);
if(i_Ret < 0)
{
TRACE_ERROR("write : %s", strerror(errno));
return(VID_ERROR_WRITE);
}
return(0);
}
Rejoignez-nous