usb-id-database 0.3.0.1 → 0.4
raw patch · 7 files changed
+286/−208 lines, 7 filesdep −binarydep −download
Dependencies removed: binary, download
Files
- System/USB/IDDB.hs +19/−9
- System/USB/IDDB/Base.hs +121/−59
- System/USB/IDDB/LinuxUsbIdRepo.hs +109/−83
- System/USB/IDDB/UsbDotOrg.hs +29/−24
- example.hs +0/−9
- usb-id-database.cabal +4/−5
- usb_dot_org_db.txt +4/−19
System/USB/IDDB.hs view
@@ -1,8 +1,14 @@ {-| A database of USB identifiers. -Databases with vendor names and identifiers can be loaded from string,-file or directly from <http://www.usb.org> or <http://linux-usb.org>.+Databases with vendor names and identifiers can be loaded from string or file. +To get the most up-to-date database download the files directly from+<http://www.usb.org>+or+<http://linux-usb.org>.++Each database's module contains an URL to the database file.+ Example usage: @@@ -45,13 +51,6 @@ ( -- *Types IDDB - , ID, Name- , VendorID, VendorName- , ProductID, ProductName- , ClassID, ClassName- , SubClassID, SubClassName- , ProtocolID, ProtocolName- , emptyDb -- *Query database@@ -62,6 +61,17 @@ , className , subClassName , protocolName+ , audioClassTerminalTypeName+ , videoClassTerminalTypeName+ , hidDescTypeName+ , hidDescItemName+ , hidDescCountryCodeName+ , hidUsagePageName+ , hidUsageName+ , physicalDescBiasName+ , physicalDescItemName+ , langName+ , subLangName ) where
System/USB/IDDB/Base.hs view
@@ -3,12 +3,8 @@ module System.USB.IDDB.Base ( IDDB(..) - , ID, Name- , VendorID, VendorName- , ProductID, ProductName, ProductDB- , ClassID, ClassName, ClassDB- , SubClassID, SubClassName, SubClassDB- , ProtocolID, ProtocolName, ProtocolDB+ , ProductDB+ , ClassDB, SubClassDB, ProtocolDB , emptyDb @@ -19,13 +15,22 @@ , className , subClassName , protocolName+ , audioClassTerminalTypeName+ , videoClassTerminalTypeName+ , hidDescTypeName+ , hidDescItemName+ , hidDescCountryCodeName+ , hidUsagePageName+ , hidUsageName+ , physicalDescBiasName+ , physicalDescItemName+ , langName+ , subLangName , getDataFileName ) where -import Data.Binary ( Binary(..), Get )- import qualified Data.IntMap as IM import qualified Data.Map as MP @@ -40,34 +45,28 @@ -- Types ------------------------------------------------------------------------------- -type ID = Int-type Name = String--type VendorID = ID-type ProductID = ID-type ClassID = ID-type SubClassID = ID-type ProtocolID = ID--type VendorName = Name-type ProductName = Name-type ClassName = Name-type SubClassName = Name-type ProtocolName = Name--type ProductDB = ( MP.Map ProductName ProductID- , IM.IntMap ProductName+type ProductDB = ( MP.Map String Int+ , IM.IntMap String )-type ClassDB = IM.IntMap (ClassName, SubClassDB)-type SubClassDB = IM.IntMap (SubClassName, ProtocolDB)-type ProtocolDB = IM.IntMap ProtocolName+type ClassDB = IM.IntMap (String, SubClassDB)+type SubClassDB = IM.IntMap (String, ProtocolDB)+type ProtocolDB = IM.IntMap String -- |A database of USB identifiers. Contains both vendor identifiers -- and product identifiers.-data IDDB = IDDB { dbVendorNameId :: MP.Map VendorName VendorID- , dbVendorIdName :: IM.IntMap VendorName+data IDDB = IDDB { dbVendorNameId :: MP.Map String Int+ , dbVendorIdName :: IM.IntMap String , dbProducts :: IM.IntMap ProductDB , dbClasses :: ClassDB+ , dbAudioCTType :: IM.IntMap String+ , dbVideoCTType :: IM.IntMap String+ , dbHIDDescType :: IM.IntMap String+ , dbHIDDescItem :: IM.IntMap String+ , dbHIDDescCCode :: IM.IntMap String+ , dbHIDUsage :: IM.IntMap (String, IM.IntMap String)+ , dbPhysDescBias :: IM.IntMap String+ , dbPhysDescItem :: IM.IntMap String+ , dbLanguages :: IM.IntMap (String, IM.IntMap String) } -- |An empty database.@@ -76,56 +75,119 @@ , dbVendorIdName = IM.empty , dbProducts = IM.empty , dbClasses = IM.empty+ , dbAudioCTType = IM.empty+ , dbVideoCTType = IM.empty+ , dbHIDDescType = IM.empty+ , dbHIDDescItem = IM.empty+ , dbHIDDescCCode = IM.empty+ , dbHIDUsage = IM.empty+ , dbPhysDescBias = IM.empty+ , dbPhysDescItem = IM.empty+ , dbLanguages = IM.empty } ---------------------------------------------------------------------------------- Binary serialisation----------------------------------------------------------------------------------instance Binary IDDB where- put db = put ( dbVendorNameId db- , dbVendorIdName db- , dbProducts db- , dbClasses db- )-- get = do (a, b, c, d) <- get :: Get ( MP.Map VendorName VendorID- , IM.IntMap VendorName- , IM.IntMap ProductDB- , ClassDB- )- return IDDB { dbVendorNameId = a- , dbVendorIdName = b- , dbProducts = c- , dbClasses = d- }--------------------------------------------------------------------------------- -- Query database ------------------------------------------------------------------------------- -vendorName :: IDDB -> VendorID -> Maybe VendorName+vendorName :: IDDB -- ^Database+ -> Int -- ^Vendor identifier+ -> Maybe String vendorName db vid = IM.lookup vid $ dbVendorIdName db -vendorId :: IDDB -> VendorName -> Maybe VendorID+vendorId :: IDDB -- ^Database+ -> String -- ^Vendor name+ -> Maybe Int vendorId db name = MP.lookup name $ dbVendorNameId db -productName :: IDDB -> VendorID -> ProductID -> Maybe ProductName+productName :: IDDB -- ^Database+ -> Int -- ^Vendor identifier+ -> Int -- ^Product identifier+ -> Maybe String productName db vid pid = IM.lookup pid . snd =<< IM.lookup vid (dbProducts db) -productId :: IDDB -> VendorID -> ProductName -> Maybe ProductID+productId :: IDDB -- ^Database+ -> Int -- ^Vendor identifier+ -> String -- ^Product name+ -> Maybe Int productId db vid name = MP.lookup name . fst =<< IM.lookup vid (dbProducts db) -className :: IDDB -> ClassID -> Maybe ClassName+className :: IDDB -- ^Database+ -> Int -- ^Class identifier+ -> Maybe String className db cid = fmap fst . IM.lookup cid $ dbClasses db -subClassName :: IDDB -> ClassID -> SubClassID -> Maybe SubClassName+subClassName :: IDDB -- ^Database+ -> Int -- ^Class identifier+ -> Int -- ^Sub class identifier+ -> Maybe String subClassName db cid scid = fmap fst $ IM.lookup scid . snd =<< IM.lookup cid (dbClasses db) -protocolName :: IDDB -> ClassID -> SubClassID -> ProtocolID -> Maybe ProtocolName+protocolName :: IDDB -- ^Database+ -> Int -- ^Class identifier+ -> Int -- ^Sub class identifier+ -> Int -- ^Protocol identifier+ -> Maybe String protocolName db cid scid protId = IM.lookup protId . snd =<< IM.lookup scid . snd =<< IM.lookup cid (dbClasses db) +audioClassTerminalTypeName :: IDDB -- ^Database+ -> Int -- ^Audio class terminal type identifier+ -> Maybe String+audioClassTerminalTypeName db actid = IM.lookup actid (dbAudioCTType db) +videoClassTerminalTypeName :: IDDB -- ^Database+ -> Int -- ^Video class terminal type identifier+ -> Maybe String+videoClassTerminalTypeName db actid = IM.lookup actid (dbVideoCTType db)++hidDescTypeName :: IDDB -- ^Database+ -> Int -- ^HID descriptor type identifier+ -> Maybe String+hidDescTypeName db hidid = IM.lookup hidid (dbHIDDescType db)++hidDescItemName :: IDDB -- ^Database+ -> Int -- ^HID descriptor item identifier+ -> Maybe String+hidDescItemName db hidid = IM.lookup hidid (dbHIDDescItem db)++hidDescCountryCodeName :: IDDB -- ^Database+ -> Int -- ^HID descriptor country code identifier+ -> Maybe String+hidDescCountryCodeName db hidid = IM.lookup hidid (dbHIDDescCCode db)++hidUsagePageName :: IDDB -- ^Database+ -> Int -- ^HID usage page identifier+ -> Maybe String+hidUsagePageName db upid = fmap fst $ IM.lookup upid (dbHIDUsage db)++hidUsageName :: IDDB -- ^Database+ -> Int -- ^HID usage page identifier+ -> Int -- ^HID usage identifier+ -> Maybe String+hidUsageName db upid uid = IM.lookup uid . snd+ =<< IM.lookup upid (dbHIDUsage db)++physicalDescBiasName :: IDDB -- ^Database+ -> Int -- ^Physical descriptor bias identifier+ -> Maybe String+physicalDescBiasName db phyid = IM.lookup phyid (dbPhysDescBias db)++physicalDescItemName :: IDDB -- ^Database+ -> Int -- ^Physical descriptor item identifier+ -> Maybe String+physicalDescItemName db phyid = IM.lookup phyid (dbPhysDescItem db)++langName :: IDDB -- ^Database+ -> Int -- ^Primary language identifier+ -> Maybe String+langName db lid = fmap fst . IM.lookup lid $ dbLanguages db++subLangName :: IDDB -- ^Database+ -> Int -- ^Primary language identifier+ -> Int -- ^Sub language identifier+ -> Maybe String+subLangName db lid slid = IM.lookup slid . snd+ =<< IM.lookup lid (dbLanguages db)
System/USB/IDDB/LinuxUsbIdRepo.hs view
@@ -1,125 +1,147 @@+{-| Functions to acquire a database from <http://linux-usb.org>. -}+ module System.USB.IDDB.LinuxUsbIdRepo ( parseDb , staticDb , fromFile- , fromWeb+ , dbURL ) where +import Control.Arrow ( second ) import Control.Monad ( fmap )+import Data.Char ( isSpace ) import Data.List ( lines, unlines, isPrefixOf ) import Data.Maybe ( fromJust )-import Network.Download ( openURIString ) import Numeric ( readHex ) import Parsimony-import Parsimony.Char ( char, hexDigit, spaces, tab )+import Parsimony.Char ( char, string, hexDigit, tab ) import System.IO ( FilePath, readFile ) import System.USB.IDDB.Base import System.USB.IDDB.Misc ( eitherMaybe, swap, restOfLine ) -import qualified Data.IntMap as IM ( IntMap, fromList )-import qualified Data.Map as MP ( Map, fromList )-+import qualified Data.IntMap as IM+import qualified Data.Map as MP -- |Construct a database from a string in the format used by -- <http://linux-usb.org>. parseDb :: String -> Maybe IDDB-parseDb = eitherMaybe . parse dbParser . stripComments- where- stripComments :: String -> String- stripComments = unlines . filter (not . isPrefixOf "#") . lines+parseDb = eitherMaybe . parse dbParser . stripBoring +-- |Remove comments and empty lines.+stripBoring :: String -> String+stripBoring = unlines+ . filter (\xs -> not (isComment xs) && not (isEmpty xs))+ . lines++isComment :: String -> Bool+isComment = isPrefixOf "#"++isEmpty :: String -> Bool+isEmpty = all isSpace+ dbParser :: Parser String IDDB-dbParser = do spaces- (vendorNameId, vendorIdName, productDB) <- lexeme vendorSection- classDB <- classSection+dbParser = do (vendorNameId, vendorIdName, productDB) <- vendorSection+ classDB <- genericSection (label "C") 2 id+ . genericSection tab 2 id+ . genericSection (count 2 tab) 2 fst+ $ return ()+ at <- simpleSection "AT" 4+ hid <- simpleSection "HID" 2+ r <- simpleSection "R" 2+ bias <- simpleSection "BIAS" 1+ phy <- simpleSection "PHY" 2+ hut <- genericSection (label "HUT") 2 id+ . genericSection tab 3 fst+ $ return ()+ l <- genericSection (label "L") 4 id+ . genericSection tab 2 fst+ $ return ()+ hcc <- simpleSection "HCC" 2+ vt <- simpleSection "VT" 4 return IDDB { dbVendorNameId = vendorNameId , dbVendorIdName = vendorIdName , dbProducts = productDB , dbClasses = classDB+ , dbAudioCTType = at+ , dbVideoCTType = vt+ , dbHIDDescType = hid+ , dbHIDDescItem = r+ , dbHIDDescCCode = hcc+ , dbHIDUsage = hut+ , dbPhysDescBias = bias+ , dbPhysDescItem = phy+ , dbLanguages = l } where- lexeme :: Parser String a -> Parser String a- lexeme p = do x <- p- spaces- return x- hexId :: Num n => Int -> Parser String n hexId d = do ds <- count d hexDigit case readHex ds of [(n, _)] -> return n _ -> error "impossible" - vendorSection :: Parser String ( MP.Map VendorName VendorID- , IM.IntMap VendorName+ label :: String -> Parser String ()+ label n = string n >> char ' ' >> return ()++ -- Top level section without subsections.+ simpleSection :: String -> Int -> Parser String (IM.IntMap String)+ simpleSection sym idSize = genericSection (string sym >> char ' ')+ idSize fst $ return ()++ genericSection :: (Parser String p)+ -> Int+ -> ((String, s) -> r)+ -> Parser String s+ -> Parser String (IM.IntMap r)+ genericSection prefix idSize convert =+ fmap (IM.fromList . map (second convert))+ . many . try . genericItem prefix idSize++ genericItem :: (Parser String p)+ -> Int+ -> Parser String s+ -> Parser String (Int, (String, s))+ genericItem prefix idSize sub = do+ _ <- prefix+ itemId <- hexId idSize+ _ <- count 2 $ char ' '+ itemName <- restOfLine+ s <- sub+ return (itemId, (itemName, s))++ vendorSection :: Parser String ( MP.Map String Int+ , IM.IntMap String , IM.IntMap ProductDB )- vendorSection = do xs <- lexeme $ many vendorParser- return ( MP.fromList [(name, vid) | (vid, name, _) <- xs]- , IM.fromList [(vid, name) | (vid, name, _) <- xs]- , IM.fromList [(vid, pdb) | (vid, _, pdb) <- xs]- )+ vendorSection = do+ xs <- many (try (vendorParser <?> "vendor"))+ return ( MP.fromList [(name, vid) | (vid, name, _) <- xs]+ , IM.fromList [(vid, name) | (vid, name, _) <- xs]+ , IM.fromList [(vid, pdb) | (vid, _, pdb) <- xs]+ ) - vendorParser :: Parser String (VendorID, VendorName, ProductDB)- vendorParser = do vid <- hexId 4- count 2 $ char ' '- name <- restOfLine- products <- many productParser- return ( vid- , name- , ( MP.fromList $ fmap swap products- , IM.fromList products- )- )+ vendorParser :: Parser String (Int, String, ProductDB)+ vendorParser = do+ vid <- hexId 4+ _ <- count 2 $ char ' '+ name <- restOfLine+ products <- many (productParser <?> "product")+ return ( vid+ , name+ , ( MP.fromList $ fmap swap products+ , IM.fromList products+ )+ ) - productParser :: Parser String (ProductID, ProductName)- productParser = do tab+ productParser :: Parser String (Int, String)+ productParser = do _ <- tab pid <- hexId 4- count 2 $ char ' '+ _ <- count 2 $ char ' ' name <- restOfLine return (pid, name) - classSection :: Parser String ClassDB- classSection = do xs <- lexeme $ many classParser- return $ IM.fromList xs-- classParser :: Parser String (ClassID, (ClassName, SubClassDB))- classParser = do char 'C'- char ' '- cid <- hexId 2- count 2 $ char ' '- name <- restOfLine- subClasses <- many subClassParser- return ( cid- , (name, IM.fromList subClasses)- )-- subClassParser :: Parser String (SubClassID, (SubClassName, ProtocolDB))- subClassParser = do tab- scid <- hexId 2- count 2 $ char ' '- name <- restOfLine- protocols <- many (try protocolParser)- return ( scid- , (name, IM.fromList protocols)- )-- protocolParser :: Parser String (ProtocolID, ProtocolName)- protocolParser = do count 2 tab- protId <- hexId 2- count 2 $ char ' '- name <- restOfLine- return (protId, name)---- |Construct a database from the data available at--- <http://linux-usb.org/usb.ids>.-fromWeb :: IO (Maybe IDDB)-fromWeb = fmap ( either (const Nothing)- parseDb- ) $ openURIString dbURL---- |Load a vendor database from file. If the file can not be read for--- some reason an error will be thrown.+-- |Load a database from file. If the file can not be read for some reason an+-- error will be thrown. fromFile :: FilePath -> IO (Maybe IDDB) fromFile = fmap parseDb . readFile @@ -127,9 +149,13 @@ -- supplied with the package. staticDb :: IO IDDB staticDb = getDataFileName staticDbPath >>= fmap fromJust . fromFile--staticDbPath :: FilePath-staticDbPath = "usb_id_repo_db.txt"+ where+ staticDbPath :: FilePath+ staticDbPath = "usb_id_repo_db.txt" +-- |<http://linux-usb.org/usb.ids>+--+-- The source of the database. Download this file for the most up-to-date+-- version. dbURL :: String dbURL = "http://linux-usb.org/usb.ids"
System/USB/IDDB/UsbDotOrg.hs view
@@ -1,17 +1,18 @@+{-| Functions to acquire a database from <http://www.usb.org>. -}+ module System.USB.IDDB.UsbDotOrg ( parseDb , staticDb , fromFile- , fromWeb+ , dbURL ) where import Control.Monad ( fmap ) import Data.Maybe ( fromJust )-import Network.Download ( openURIString ) import Parsimony import Parsimony.Char ( char, digit ) import System.IO ( FilePath, readFile )-import System.USB.IDDB.Base ( IDDB(..), VendorID, VendorName+import System.USB.IDDB.Base ( IDDB(..) , getDataFileName ) import System.USB.IDDB.Misc ( eitherMaybe, swap, restOfLine )@@ -25,14 +26,24 @@ parseDb = eitherMaybe . parse staticDbParser staticDbParser :: Parser String IDDB-staticDbParser = do vendors <- many vendorParser- return IDDB { dbVendorNameId = MP.fromList $ fmap swap vendors- , dbVendorIdName = IM.fromList vendors- , dbProducts = IM.empty- , dbClasses = IM.empty- }+staticDbParser = do+ vendors <- many vendorParser+ return IDDB { dbVendorNameId = MP.fromList $ fmap swap vendors+ , dbVendorIdName = IM.fromList vendors+ , dbProducts = IM.empty+ , dbClasses = IM.empty+ , dbAudioCTType = IM.empty+ , dbVideoCTType = IM.empty+ , dbHIDDescType = IM.empty+ , dbHIDDescItem = IM.empty+ , dbHIDDescCCode = IM.empty+ , dbHIDUsage = IM.empty+ , dbPhysDescBias = IM.empty+ , dbPhysDescItem = IM.empty+ , dbLanguages = IM.empty+ } where- vendorParser :: Parser String (VendorID, VendorName)+ vendorParser :: Parser String (Int, String) vendorParser = do vid <- many1 digit char '|' name <- restOfLine@@ -43,24 +54,18 @@ fromFile :: FilePath -> IO (Maybe IDDB) fromFile = fmap parseDb . readFile --- |Construct a database from the list of companies available at--- <http://www.usb.org/developers/tools/comp_dump>. The website--- informs us that: /"Remember this list changes almost daily, be/--- /sure to get a fresh copy when you use the tools"/. However, the--- list seems to be quite stable. Using this function more than once--- a day is probably overkill.-fromWeb :: IO (Maybe IDDB)-fromWeb = fmap ( either (const Nothing)- parseDb- ) $ openURIString dbURL- staticDbPath :: FilePath staticDbPath = "usb_dot_org_db.txt" -dbURL :: String-dbURL = "http://www.usb.org/developers/tools/comp_dump"- -- |Load a database from a snapshot of the usb.org database which is -- supplied with the package. staticDb :: IO IDDB staticDb = getDataFileName staticDbPath >>= fmap fromJust . fromFile++-- |<http://www.usb.org/developers/tools/comp_dump>+--+-- The source of the database. Download this file for the most up-to-date+-- version.+dbURL :: String+dbURL = "http://www.usb.org/developers/tools/comp_dump"+
example.hs view
@@ -26,12 +26,3 @@ -- from the vendor with ID 0x1d6b. putStrLn $ maybe "unknown product name!" (printf "0x%04x") $ productId db 0x1d6b "Audio Gadget"-- putStrLn $ maybe "unknown class" id- $ className db 0xe0-- putStrLn $ maybe "unknown subclass" id- $ subClassName db 0xe0 1-- putStrLn $ maybe "unknown protocol" id- $ protocolName db 0xe0 1 2
usb-id-database.cabal view
@@ -1,5 +1,5 @@ name: usb-id-database-version: 0.3.0.1+version: 0.4 cabal-version: >=1.6 build-type: Simple stability: provisional@@ -11,8 +11,9 @@ category: System synopsis: A database of USB identifiers description:- Functions to find the names associated with numerical vendor and- product identifiers.+ Functions to find the names associated with various identifiers from the USB+ specification. This is useful if you want to display full human-readable names+ instead of cryptic numeric codes. extra-source-files: example.hs data-files: usb_dot_org_db.txt@@ -28,10 +29,8 @@ library build-depends: base >= 3 && < 4.2- , binary == 0.5.* , bytestring == 0.9.* , containers == 0.2.*- , download == 0.3.* , parsimony >= 1 && < 1.1 ghc-options: -Wall cpp-options: -DBUILD_WITH_CABAL
usb_dot_org_db.txt view
@@ -19,7 +19,6 @@ 1060|SMSC 1062|Integrated Device Technology 1071|Molex Inc.-1072|Fujitsu Component Limited 1074|Unisys Corp. 1080|Advanced Micro Devices 1085|Lexmark International Inc.@@ -230,7 +229,6 @@ 2554|Mtek Vision 2578|Cambridge Silicon Radio Ltd. 2580|Spacelabs Healthcare-2582|Trek Technology (S) Pte Ltd 2583|HOYA Corporation 2593|Medtronic Physio Control Corp. 2631|Hirose Electric@@ -255,7 +253,6 @@ 2856|Kenwood Corporation 2876|Olivetti S.p.A 2894|Musical Electronics Ltd.-2900|Sinbon Electronics Co., Ltd. 2922|Maxim Integrated Products 2965|ASIX Electronics Corporation 2967|O2 Micro, Inc.@@ -311,14 +308,12 @@ 3562|UTECH Electronic (D.G.) Co., Ltd. 3607|Walex Electronic Ltd. 3619|Liou Yuane International Ltd.-3636|Micro Computer Control Corp. 3641|Smart Modular Technologies, Inc. 3642|Neostar Technology Co., Ltd. 3675|Union Power Information Industrial Co., Ltd. 3677|Neltron Industrial Co., Ltd. 3690|Megawin Technology Co., Ltd. 3698|Hsi-Chin Electronics Co., Ltd.-3714|Ching Tai Electric Wire & Cable Co., Ltd. 3715|Shin An Wire & Cable Co. 3724|Well Force Electronic Co., Ltd 3725|MediaTek Inc.@@ -348,7 +343,6 @@ 4027|Bitwise Systems, Inc. 4046|Sony Ericsson Mobile Communications AB 4087|CHI SHING COMPUTER ACCESSORIES CO., LTD.-4100|LG Electronics Inc. 4134|Newly Corporation 4168|Targus Group International 4172|AMCO TEC International Inc.@@ -388,6 +382,7 @@ 4716|Aristocrat Technologies 4717|Bel Stewart 4721|Foxda Technology Industrial (Shenzhen) Co., Ltd.+4742|MARVELL SEMICONDUCTOR, INC. 4756|RISO KAGAKU CORP. 4779|Honey Bee Electronic International Ltd. 4792|Zhejiang Xinya Electronic Technology Co., Ltd.@@ -441,7 +436,6 @@ 5488|ALLTOP TECHNOLOGY CO., LTD. 5499|Ketron SRL 5510|Sitor Electronics (Shenzhen) Co., Ltd.-5517|Oakley Inc. 5528|Kunshan Guoji Electronics Co., Ltd. 5538|Freescale Semiconductor, Inc. 5546|Gearway Electronics (Dong Guan) Co., Ltd.@@ -480,7 +474,6 @@ 6133|K.K. Rocky 6134|Unicomp, Inc 6193|Gwo Jinn Industries Co., Ltd.-6194|Huizhou Shenghua Industrial Co., Ltd. 6228|Memory Devices Ltd. 6242|Teridian Semiconductor Corp. 6257|Aveo Technology Corp.@@ -502,7 +495,6 @@ 6537|Nuconn Technology Corp. 6541|Fairchild Imaging 6556|Richnex Microelectronics Corporation-6568|Biforst Technology Inc. 6607|Parrot SA 6632|Industrial Technology Research Institute 6639|Pak Heng Technology (Shenzhen) Co., Ltd.@@ -559,9 +551,7 @@ 7329|Symwave, Inc. 7347|Aces Electronic Co., Ltd. 7348|OPEX CORPORATION-7358|Texas Instruments - Stellaris 7359|FORTAT SKYMARK INDUSTRIAL COMPANY-7360|PlantSense 7370|NextWave Broadband Inc. 7390|Telecommunications Technology Association (TTA) 7391|WonTen Technology Co., Ltd.@@ -618,15 +608,7 @@ 7911|EPCOS 7912|ONDA COMMUNICATION S.p.a. 7913|PC PARTNER LIMITED-7936|YUEQING ZHONGLI COMPUTER ELECTRONICS CO., LTD.-7950|Inflexis Corporation-7951|Action Technology (SZ) Co., Ltd.-7952|LTW TECHNOLOGY CO., LTD.-7953|VIRAGE LOGIC-7954|Photometrics 7958|Olidata SpA-7965|How Weih Precision Metal (Shenzhen) Co., Ltd.-7968|Shenzhen Tenwei Electronics Co., Ltd. 7977|Analogix Semiconductor, Inc. 7985|SASKEN COMMUNICATION TECH LTD. 7989|Amphenol Shouh Min Industry@@ -697,4 +679,7 @@ 8457|VIA Labs, Inc. 8469|Alliance Material Co., Ltd. 8470|KT Tech Inc.+8492|Shenzhen Linoya Electronic Co., Ltd.+8493|Dong Guan City Marubeni Electronic Co., Ltd.+8494|Amphenol AssembleTech (Xiamen) Co., Ltd. 8888|Motorola MDS