PICマイコン USB HOST(USB Framework)のベンダークラス対応

マイクロチップ・テクノロジー社より提供されているApplication librariesに含まれるUSB Framework(v2013-06-15)を使用して、USBホストを構築する場合に、USBの標準クラスを使用する場合は問題ありませんが、ベンダークラスを使用した場合には、一部不適合箇所があります。

【usb_host.c】

BYTE USBHostIssueDeviceRequest( BYTE deviceAddress, BYTE bmRequestType,
            BYTE bRequest, WORD wValue, WORD wIndex, WORD wLength,
            BYTE *data, BYTE dataDirection, BYTE clientDriverID )
{
		・
		・
		・
    // If the user is doing a SET INTERFACE, we must reset DATA0 for all endpoints.
    if (bRequest == USB_REQUEST_SET_INTERFACE)		// !問題箇所
    {
        USB_ENDPOINT_INFO           *pEndpoint;
        USB_INTERFACE_INFO          *pInterface;
        USB_INTERFACE_SETTING_INFO  *pSetting;

条件文が(bRequest == SET_INTERFACE)となっていますが、SET_INTERFACEというのは標準リクエストでの値は[11]である為、ベンダーリクエストで値が[11]の要求があった場合に、上記の処理が意図せず実行されてしまいます。
以下のように修正することで、bmRequestTypeを「ホストからデバイス」「標準リクエスト」「リクエスト対象がデバイス」に限定します。

【usb_host.c】
BYTE USBHostIssueDeviceRequest( BYTE deviceAddress, BYTE bmRequestType,
            BYTE bRequest, WORD wValue, WORD wIndex, WORD wLength,
            BYTE *data, BYTE dataDirection, BYTE clientDriverID )
{
		・
		・
		・
    // If the user is doing a SET INTERFACE, we must reset DATA0 for all endpoints.
//  if (bRequest == USB_REQUEST_SET_INTERFACE)		// !修正箇所
    if ((bRequest == USB_REQUEST_SET_INTERFACE)
      && (bmRequestType == USB_SETUP_HOST_TO_DEVICE | USB_SETUP_TYPE_STANDARD | USB_SETUP_RECIPIENT_DEVICE))
    {
        USB_ENDPOINT_INFO           *pEndpoint;
        USB_INTERFACE_INFO          *pInterface;
        USB_INTERFACE_SETTING_INFO  *pSetting;

ベンダーリクエストに[11]が存在するデバイス用のドライバを開発する場合は、この対応が必須となります。

タグ


2013年10月17日 | コメントは受け付けていません。|

カテゴリー:技術情報

Atmel Studio 6でのcppcheckを使用する方法

今回はAtmel Studio 6でcppcheckを使用する方法をご紹介します。
※cppcheckはすでにインストールされているものとして記載いたします。

この投稿の続きを読む »

タグ


2013年2月24日 | コメントは受け付けていません。|

カテゴリー:技術情報

MicroBlazeソフトウエア開発(受託開発)

ザイリンクス社製FPGA Spartan6に実装した ソフト プロセッサ コア MicroBlaze のソフトウエアのを受託開発いたしました。
開発概要としては、生産ライン用の検査機のマイコンソフトウエア開発です。
ザイリンクス社から提供されているPOSIX準拠のRTOS xilkernel を使用しました。

タグ


2012年9月11日 | コメントは受け付けていません。|

カテゴリー:開発実績

PICマイコンのスタックについて

PICマイコンは、スタックをRAM領域に置きません。RAM領域とは別にハードウエアのスタックが用意されています。ハードウエアのスタックはデバイスの規模によって違いますが、最小で2個しか持っていないものも多くあります。

CCS Cコンパイラでのスタックの消費

ハードウエアスタックは、関数コールする毎に戻りアドレスを保存するためにスタックを1つ消費します。実際には、すべての関数コールでスタックを消費することは無く、1箇所からのみ呼び出される関数に関しては、コンパイラはジャンプ命令を使用することでスタックを消費しないようにコンパイルします。しかし、それでもスタックが2個の場合、関数を機能毎に細分化すると、すぐにスタック不足となってしまいます。その様な場合には、複数個所から呼ばれる関数でも、インライン関数にすることでスタックの消費を回避できます。しかし、インライン関数にすると、ROM消費量は当然増加してしまいます。
スタックが不足するようプログラムを作成してコンパイルしても、コンパイラは警告等を発することはありません。実際にプログラムを実行すると、スタック破壊を起こして、PICマイコンは暴走状態に陥ります。
プログラマはスタック消費量を常に意識してコーディングに取り組む必要があります。

この投稿の続きを読む »

タグ


2012年8月27日 | コメントは受け付けていません。|

カテゴリー:技術情報

Doxygen対応Cプログラムコメント記述例ご紹介

弊社でのC言語で開発を行うプロジェクトでは、ソフトウェア詳細設計書にDoxygenで出力したデータを用いるため、必要な情報を出力するためのコメント記述をしております。

今回は弊社で用いるタグコメントの書き方について紹介させて頂きます。

実際にはDoxygenのオプション設定などにより別の記述もございますので、詳しくはDoxygenのサイトを参照頂ければと思います。

この投稿の続きを読む »

タグ


2012年8月26日 | コメントは受け付けていません。|

カテゴリー:技術情報

このページの先頭へ

イメージ画像